简体   繁体   中英

log4j: How can I direct logs into different files for a cron and for a webservice?

I have a Cron and a Webservice, both implemented using spring. The cron and the webservice use a set of classes A, B and C to achieve their objective.

In each class, I use log4j 2 as the logging mechanism as so:

Logger log = LogManager.getLogger(A.class.getName());

In the log4j.xml, I have a single RollingAppender which logs to a file.

Now, I would like the Cron to log to a different file ie use a different appender. But if I set the category for the cron to use a different appender, that still doesn't cause the logs from A, B and C to go into that appender.

Update: log4j configuration:

<Configuration status="warn" name="mylogger" packages="">
  <Properties>
    <Property name="baseDir">/var/log/tomcat</Property>
  </Properties>
  <Appenders>
    <RollingFile name="RollingFile" fileName="${baseDir}/app.log"
      filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz">
    <PatternLayout><Pattern>%5p %d{ISO8601} [%t][%x] %c - %m%n</Pattern></PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy />
    </Policies>
  </RollingFile>
  </Appenders>
  <Loggers>
   <Root level="debug">
     <AppenderRef ref="RollingFile"/>
   </Root>
 </Loggers>
</Configuration>

You can use below mentioned configuration if you want to log into different files using same class.

<Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <RollingFile name="rollingFileAppender"
            fileName="/data/abc.log"
            filePattern="/data/abc-%d{MM-dd-yyyy}-%i.log">
            <PatternLayout>
                <Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
                <SizeBasedTriggeringPolicy size="50 MB" />
            </Policies>
        </RollingFile>
        <RollingFile name="rollingFilesAppender"
            fileName="/data/cde.log"
            filePattern="/data/fgh-%d{MM-dd-yyyy}-%i.log">
            <PatternLayout>
                <Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
                <SizeBasedTriggeringPolicy size="50 MB" />
            </Policies>
        </RollingFile>
    </Appenders>

<Loggers>

        <Root level="ERROR">
            <AppenderRef ref="CONSOLE" />
        </Root>

        <Logger name="rollingFilesLogger" additivity="false" level="WARN">
            <AppenderRef ref="rollingFilesAppender" />
        </Logger>

        <Logger name="com.log4jtest" additivity="false" level="INFO">
            <AppenderRef ref="rollingFileAppender" />
        </Logger>

    </Loggers>

In Java file you can use like :

private static final Logger LOGGER = LogManager.getLogger(Hello.class);

private static final Logger SECOND_LOGGER = LogManager.getLogger("rollingFilesLogger");

Using this you will be able to send logs in two different files.

Ref : https://github.com/ragnar-lothbrok/log4j2-example

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM