对于一些人来说,这可能是一个非常简单的问题,但就我个人而言,Log4j配置非常困难,学习执行脑部手术可能没有那么困难。
我正试图让多个日志记录者登录到不同的文件。这是我的log4j中的内容。属性文件:
# Root logger option
log4j.rootLogger=INFO, file, admin
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/home/nick/logging/file.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
log4j.appender.admin=org.apache.log4j.RollingFileAppender
log4j.appender.admin.File=/home/nick/logging/admin.log
log4j.appender.admin.MaxFileSize=1MB
log4j.appender.admin.MaxBackupIndex=1
log4j.appender.admin.layout=org.apache.log4j.PatternLayout
log4j.appender.admin.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
这是我的(非常简单的)Java应用程序用于测试配置:
public static void main(String[] args) throws Exception {
Properties resource = new Properties();
InputStream in = new FileInputStream("/home/nick/logging/log4j.properties");
resource.load(in);
PropertyConfigurator.configure(resource);
Logger admin = Logger.getLogger("admin");
Logger file = Logger.getLogger("file");
admin.info("hello admin");
file.info("hello file");
}
我有两个问题:
有一个问题,我总是在PropertyConfigurator行中遇到异常。配置(资源)
:
java.io.FileNotFoundException: /home/nick/logging (Is a directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at java.io.FileOutputStream.<init>(FileOutputStream.java:136)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:289)
at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:167)
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:163)
at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:256)
第二个问题是,这两条消息都会写入两个日志。以下是实际结果:
文件管理员:日志:
2014-04-27 11:55:30 INFO admin - hello admin
2014-04-27 11:55:30 INFO file - hello file
文件。日志:
2014-04-27 11:55:30 INFO admin - hello admin
2014-04-27 11:55:30 INFO file - hello file
以下是所需的结果:
文件管理员:日志:
2014-04-27 11:55:30 INFO admin - hello admin
文件。日志:
2014-04-27 11:55:30 INFO file - hello file
是什么导致了异常,如何才能达到所需的结果?
不需要加载属性文件。只需将其放在src
文件夹中,该文件夹将自动添加到类路径中。
示例代码:
public static void main(String[] args) throws Exception {
Logger admin = Logger.getLogger("admin");
Logger file = Logger.getLogger("file");
admin.info("hello admin");
file.info("hello file");
}
回答我自己的问题,这是我需要的:
log4j.logger.file=DEBUG, fileAppender
log4j.logger.admin=DEBUG, adminAppender
log4j.additivity.file=false
log4j.additivity.admin=false
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=/home/nick/logging/file.log
log4j.appender.fileAppender.MaxFileSize=1MB
log4j.appender.fileAppender.MaxBackupIndex=1
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
log4j.appender.adminAppender=org.apache.log4j.RollingFileAppender
log4j.appender.adminAppender.File=/home/nick/logging/admin.log
log4j.appender.adminAppender.MaxFileSize=1MB
log4j.appender.adminAppender.MaxBackupIndex=1
log4j.appender.adminAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.adminAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
Log4J区分了负责生成日志消息的记录器和负责将这些消息发送到某个地方(文件、控制台、数据库等)的附加程序。记录器形成一个层次结构,根记录器是名为admin
的记录器的父级,它是admin.component1
等的父级,您可以将附加程序附加到层次结构中的任何记录器。默认情况下,记录器将向直接附加到它的所有附加程序或层次结构中的任何祖先发送消息(这就是为什么记录器通常被命名为Java类,例如,您可以通过配置com.example
记录器来控制com.example.Class1
和com.example.subpkg.antherClass
的日志记录)。
记录器和附加程序形成单独的命名空间,这是您混淆的根源-名为admin
的记录器和名为admin
的附加程序是两个独立的实体。
您在问题中给出的配置定义了一个记录器(根记录器),它将生成的所有消息发送到两个单独的appender,两个文件各一个。然后,您的代码请求两个不同的记录器,并为每个记录器生成一条日志消息。这两个记录器都从根记录器继承appender配置,因此它们都将消息发送到两个已配置的appender。
您应该将file
appender附加到file
logger,而不是将两个附加程序附加到root logger,将admin
appender附加到admin
logger:
log4j.rootLogger=INFO
log4j.logger.file=INFO, file
log4j.logger.admin=INFO, admin
这样,文件
记录器将只向文件发送消息。日志
,管理员
日志只记录到管理员。日志
,来自其他日志记录器的所有消息都将被默默地丢弃,因为根目录上没有附加程序。
additivity标志是该规则的例外——将记录器的additivity设置为false基本上会断开从记录器到其父级的箭头连接,因此该记录器生成的消息(或从其子级流入的消息)不会在树的更上一层,它们只会到达直接连接到相关记录器的附加器。
我的目标是: 实现所有自定义,内置记录器从同一个包到不同的文件。 信息-信息日志文件 我尝试的是: 问题是: 记录器名称相同。因此,最新的记录器只能工作。在这种情况下,Info可以工作,但也不能调试。 我的疑问是: 我引用了这么多帖子。我认为下面的方法是有效的。 按此处所述,将每一个作为自定义记录器。但我确信这是否正确的解决方案
问题内容: 我有一个普通的INFO级别应用日志。我需要的是另外记录所有错误级别的事件,以单独的错误日志。我正在使用这样的配置: 此配置仅记录错误。如果我首先放置信息级别记录器,则它将仅记录到一般附加程序,但错误记录器将无法工作。我想让他们两个都工作。 问题答案: 您需要做的是只有一个定义了INFO级别的定义,但是在您的两个追加器定义中,您需要相应地设置其阈值,例如 然后,将两个追加程序添加到记录器
本文向大家介绍利用Log4j将不同Package的日志输出到不同文件的方法,包括了利用Log4j将不同Package的日志输出到不同文件的方法的使用技巧和注意事项,需要的朋友参考一下 前言 随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就存在以下这些日志: 接收外界消息的日志、对外发送消息的日志; 后台常驻线程的处理日志
问题内容: 我正在使用log4j登录我的应用程序。我正在尝试在不同文件中使用不同级别的日志,但是出了点问题。对于解决此问题的任何帮助,我们将不胜感激。 问题答案: log4j附加程序的标准行为是,它们以其阈值级别 或更高 的阈值记录所有消息,即具有阈值INFO的附加器将记录INFO,WARN,ERROR和FATAL消息,但不记录DEBUG。如果你想记录 只有 INFO信息,但不会发出警告及以上,然
如何编写一个简单的log4j2.xml文件,将不同级别的日志放入不同的文件中? 例如,我们有错误日志,任何信息日志,我需要将所有错误日志消息推入一个日志文件,所有信息日志消息推入另一个文件。 我怎么做?
我在我的项目中使用log4j。我想有标准输出、调试记录器和最终报告记录器。调试记录器几乎写调试/信息级别的消息。报告将是不同的记录器,只写信息消息。我尝试了不同的方法,阅读了很多示例,我仍然无法解决这个问题。要么我丢失了我的标准输出,要么我将所有调试写入两个记录器。 我的密码在这里 } 任何提示都将不胜感激