问题描述
我需要将所有信息记录到info.log,所有警告warn.log等,以及我所有的logs to all.log.我一直在创建log4j2.xml配置.
<?xml version="1.0" encoding="UTF-8"?> <configuration monitorInterval = "3" status = "info"> <appenders> <File name="ALL_LOG" fileName="logs/all.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_ERROR" fileName="logs/error.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_INFO" fileName="logs/info.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_DEBUG" fileName="logs/debug.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_WARN" fileName="logs/warn.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <Console name="STDOUT" target="SYSTEM_OUT.log"> <PatternLayout pattern="%d{ABSOLUTE} [%-5p] (%F:%L) - %m%n"/> </Console> </appenders> <loggers> <root> <appender-ref ref="ALL_LOG"/> </root> <root level="error"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE_ERROR"/> </root> <root level="info"> <appender-ref ref="FILE_INFO"/> </root> <root level="debug"> <appender-ref ref="FILE_DEBUG"/> </root> <root level="warn"> <appender-ref ref="FILE_WARN"/> </root> </loggers> </configuration>
在我的程序中我定义了记录器:
public class Main { public static Logger LOG = Logger.getLogger(Main.class); public static void main(String[] args) { LOG.debug("Debug message"); LOG.warn("Warning message"); LOG.info("Info message"); }
,但仅在file warn.log中我有Warning message,其他文件创建但空.我做错了什么?
推荐答案
您只能在配置中具有一个记录器.在该根记录器上,定义多个appender-refs,每个文件appender一个.
- 对于每个appender-ref,指定级别,要过滤得太详细的事件:
<Appender-ref ref="InfoFile" level="info" />
- 然后,在每个文件appender上,有一个过滤器,该过滤器拒绝并非完全理想的级别.这会滤除太一般性的事件.参见示例的这个问题
问题描述
I need to log all info to info.log, all warn to warn.log etc and all my logs to all.log. I've been create a log4j2.xml configuration.
<?xml version="1.0" encoding="UTF-8"?> <configuration monitorInterval = "3" status = "info"> <appenders> <File name="ALL_LOG" fileName="logs/all.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_ERROR" fileName="logs/error.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_INFO" fileName="logs/info.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_DEBUG" fileName="logs/debug.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <File name="FILE_WARN" fileName="logs/warn.log"> <PatternLayout pattern="%d{ISO8601} [%-5p] (%F:%L) - %m%n"/> </File> <Console name="STDOUT" target="SYSTEM_OUT.log"> <PatternLayout pattern="%d{ABSOLUTE} [%-5p] (%F:%L) - %m%n"/> </Console> </appenders> <loggers> <root> <appender-ref ref="ALL_LOG"/> </root> <root level="error"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE_ERROR"/> </root> <root level="info"> <appender-ref ref="FILE_INFO"/> </root> <root level="debug"> <appender-ref ref="FILE_DEBUG"/> </root> <root level="warn"> <appender-ref ref="FILE_WARN"/> </root> </loggers> </configuration>
In my programm i define logger:
public class Main { public static Logger LOG = Logger.getLogger(Main.class); public static void main(String[] args) { LOG.debug("Debug message"); LOG.warn("Warning message"); LOG.info("Info message"); }
But only in file warn.log i have Warning message, other files create, but empty. What i doing wrong?
推荐答案
You can only have one logger in the configuration. On that root logger, define multiple Appender-Refs, one for each File appender.
- For each Appender-Ref, specify the level, to filter out too detailed events:
<Appender-ref ref="InfoFile" level="info" />
- Then, on each File Appender, have a filter that DENIES events that are not exactly the desired level. This filters out events that are too general. See this question for an example.
相关标签/搜索