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

Bart S. commented on LOG4J2-952:
--------------------------------

I was writing before all of your comments (the last 3, by Gary and Behrooz).

I've read the entire source file mostly. I'd suggest putting everything in Maps 
and Sets and then generating the relevant objects out of that might not be the 
most.. pristine way of doing it, but I guess... I would suggest mostly not to 
use the same method for creating file and console loggers. I'd suggest a way to 
set additivity and a way to set level per config. Per LoggerConfig. Personally 
I would prefer a directer way of dealing with these general objects, except 
with the way of not having to "store" them directly (ie. requiring the imports 
and all). That said, I'd prefer to see the structure of the generated objects 
reflected in the method calls I do. For instance, I would want to generate 
LoggerConfigs and Appenders and add the Appenders to the LoggerConfigs.

Something like.

{{addLoggerConfig("name", additivity);
addAppender("name", Appenders.CONSOLE, pattern);
addAppenderToConfig("name", "name");}}

The closer you stay to the inherit structure, the more powerful your system 
will be; ie. the closer you stay to the actual configuration under the hood, 
the less you will run into impossibilities. That also should mean you operate 
on a Configuration (or at least its objects) directly, but I don't know how 
feasible that should be, given that many of these objects require a conf 
parameter to begin with; you can't just create them floating in free air. In 
any way, that is your specifics and mechanics, I'm free to not use it if I want 
;-). That's all I'm saying really. Mind you that you won't create a system that 
many users will not want to use for whatever reasons. If it is then 
incorporated into Log4J proper we'd all be embarrassed ;-).

Ideally this should really be the Builder subclass (inner class) of 
Configuration itself. But that might make Configuration a huge file. But if it 
was incorporated, Configuration itself could have the newBuilder() method. That 
would indeed create a Configuration; after that comes installing. Your code 
currently does the entire reconfiguration and of course also installs the 
factory object. It essentially generates a config, gives it to the factory, the 
factory is given to the init system of Log4J, which then simply requests back 
the config from it. Maybe, generally, that couldn't be done if it was truly 
Configuration's Builder. Then you wouldn't have the weird issue at least that 
essentially {{configure()}} is the main method of the class, and not 
{{build()}} (kinda breaking the agreement or contract of that specification). 
Maybe you want to isolate the builder itself from some wrapper thing that 
causes the injection into the main system.

In other words, the thing that applies it and effectuates it would be a 
different class from the Builder itself. I think that would be a better 
strategy, separation of concerns so to speak. But still good implementation and 
concept.

That's all I wanted to say I guess. I'm just a bystander at this point but just 
concerning myself with these things at the moment. Regards.

> FAQ: How do I configure log4j2 programmatically in code without a 
> configuration file?
> -------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-952
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-952
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: API, Configurators, Documentation
>    Affects Versions: 2.1
>            Reporter: Joe Merten
>
> I found [this 
> link|http://logging.apache.org/log4j/2.x/faq.html#config_from_code] which 
> said:
> {quote}
> You could use the static method #initialize(String contextName, ClassLoader 
> loader, String configLocation) in 
> org.apache.logging.log4j.core.config.Configurator. (You can pass null for the 
> class loader.) Be aware that this class is not part of the public API so your 
> code may break with any minor release.
> {quote}
> This documentation is unclear because it points to a member function which 
> needs a filename {{configLocation}} where as the topic is »without a 
> configuration file«.
> It shoud rather point to the member function 
> {{org.apache.logging.log4j.core.config.Configurator.initialize(ClassLoader 
> loader, ConfigurationSource source)}}.
> Example:
> {code:java}
> import org.apache.logging.log4j.core.config.ConfigurationSource;
> import org.apache.logging.log4j.core.config.Configurator;
> final String hardCodedXmlConfig =
>         "<?xml version='1.0' encoding='UTF-8'?>\n" +
>         "<Configuration status='INFO'>\n" +
>         "  <Appenders>\n" +
>         "    <Console name='Console' target='SYSTEM_OUT'>\n" +
>         "      <PatternLayout pattern='%d{HH:mm:ss.SSS} [%t] %-5level 
> %logger{36} - %msg%n'/>\n" +
>         "    </Console>\n" +
>         "  </Appenders>\n" +
>         "  <Loggers>\n" +
>         "    <Root level='debug'>\n" +
>         "      <AppenderRef ref='Console'/>\n" +
>         "    </Root>\n" +
>         "  </Loggers>\n" +
>         "</Configuration>\n";
> try {
>     Configurator.initialize(null, new ConfigurationSource(new 
> ByteArrayInputStream(hardCodedXmlConfig.getBytes())));
> } catch (IOException e) {
>     e.printStackTrace();
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to