logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Roger Kapsi (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LOG4J2-1531) Change attribute and component values from String to Object
Date Fri, 19 Aug 2016 22:49:20 GMT

    [ https://issues.apache.org/jira/browse/LOG4J2-1531?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15428968#comment-15428968

Roger Kapsi commented on LOG4J2-1531:

So Clojure itself is Java 6+ compatible. I'm happy to contribute a DSL if you're looking for
a configuration method that isn't as static as Java and as not as "detached" as XML/JSON/YAML/Properties.
The beauty of Clojure is that it compiles down to bytecode, you get the benefits of a Compiler
as your input validation and it remains dynamic. 

I've been referring to Java 8+ and Java lambdas as I don't know how familiar you're with Clojure/Lisp.
Java would be a little bit more static (even with lambdas) but there are simply things such

(logger, level, marker, msg) -> logger.getName().equals("org.apache.MyClass")
    && level.equals(Level.ERROR)
    && msg != null && msg.contains("Hello, World!");

That cannot be expressed very elegantly in XML/JSON/YAML/Propertie and even it was possible,
Log4J2's API simply doesn't allow it right now because every configuration value is assumed
to be a String.

This ticket is about opening the door for non-String configuration values that can be passed
into {{@Plugin}} and {{@PluginFactory}} which enables rich programmatic configuration from
Java, Clojure, Scala, Kotlin, Groovy. The emphasis is on programmatic configuration. There
is no interest on my end in parsing and object mapping of Strings ala XML, JSON, YAML, Properties.

> Change attribute and component values from String to Object
> -----------------------------------------------------------
>                 Key: LOG4J2-1531
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1531
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: Core
>    Affects Versions: 2.6.2
>            Reporter: Roger Kapsi
>         Attachments: log4j2-1531-1.0.patch
> I was looking into creating a ConfigurationFactory/Builder that is backed by a Clojure
DSL. It works rather beautifully until I tried to create a filter that is backed by a Clojure
function. There is literally  no way to pass arbitrary objects into a PluginFactory. All component
values and attributes are assumed to be Strings.
> {code:java}
> (configuration
>   (appender "stdout" "CONSOLE"
>     (layout "PatternLayout"
>       (attribute "pattern" "%d [%t] %-5level: %msg%n"))
>     (filter "ClojureFilter"
>       ;; This LoC doesn't work: addAttribute(key, value)
>       ;; will store the toString() of the value. Bummer.
>       ;; I'd the so easy and beautiful if it didn't.
>       (attribute "fn" (fn [logger & more] (println logger)))))
>   (logger "TestLogger" Level/INFO
>     (appender-ref "rolling")
>     (attribute "additivity" false))
>   (root-logger Level/DEBUG 
>     (appender-ref "rolling")))
> {code}
> {code:java}
> @Plugin(name = "ClojureFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE,
printObject = true)
> class ClojureFilter extends AbstractFilter {
>   @PluginFactory
>   public static ClojureFilter createFilter(
>       @PluginAttribute("fn") IFn fn, ...) {
>      return new ClojureFilter(fn, ...);
>   }
> }
> {code}

This message was sent by Atlassian JIRA

To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org

View raw message