如何在本地运行时登录到控制台,并在使用log4j2在服务器上运行时记录到滚动日志文件?
问题描述:
您好,我的当前项目要求我,如标题所示,当开发人员在其计算机上运行应用程序时登录控制台,并在应用程序在服务器上运行时登录到滚动日志文件。到目前为止,我已经创建了一个log4j2.properties文件(见下文),它可以很好地记录到控制台和滚动日志文件。我已经研究过,并且在Apache网站和其他网站上看到过使用路由appender的例子,但所有的例子都使用了log4j2.xml文件。有没有可能使用log4j2.properties文件创建这个?谢谢。如何在本地运行时登录到控制台,并在使用log4j2在服务器上运行时记录到滚动日志文件?
status = error
dest = err
name = PropertiesConfig
property.filename = C:\\MyApplications\\ExampleApplication\\Example.log
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
#LOG TO CONSOLE
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{1} - %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = debug
#LOG TO ROLLING FILE
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = ExampleLogBackup-%d{MM-dd-yy}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{1} - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 10
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=1MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20
logger.rolling.name = com.myapp.example
logger.rolling.level = debug
logger.rolling.additivity = true
logger.rolling.appenderRef.rolling.ref = RollingFile
rootLogger.level = debug
rootLogger.appenderRef.stdout.ref = STDOUT
答
下面添加您的属性配置文件中的行后RollingFileAppender
配置 -
appender.routing.type = Routing
appender.routing.name = routingLogger
appender.routing.script.type = Script
appender.routing.script.name = RoutingCondition
appender.routing.script.language = JavaScript
# Condition is - if isLocalMachine VM argument is true (-DisLocalMachine=true),
# then log messages in console else log messages in file.
appender.routing.script.value = var imports = new JavaImporter(java.lang); \
with (imports) { \
System.getProperty("isLocalMachine") == "true" ? "console" : "file"; \
}
appender.routing.routes.type = Routes
appender.routing.routes.route1.type = Route
appender.routing.routes.route1.ref = STDOUT
appender.routing.routes.route1.key = console
appender.routing.routes.route2.type = Route
appender.routing.routes.route2.ref = RollingFile
appender.routing.routes.route2.key = file
然后使用这个RoutingAppender
在Logger
-
logger.rolling.appenderRef.routing.ref = routingLogger
同为RootLogger
-
rootLogger.appenderRef.routing.ref = routingLogger
日志的路由将基于isLocalMachine VM argument
的值完成。如果isLocalMachine VM argument
是true
(-DisLocalMachine=true
),则在控制台中记录消息,否则在文件中记录消息。
因此,在您的本地开发环境中,您可以将此VM argument
设置为true
值以启用在控制台中的日志记录。对于服务器,无需设置此VM argument
。
这与您所描述的一样。非常感谢! :D – pukimonstr
嗨Vikas,请你指导我如何找到答案?你有没有找到一些文档,或者这是来自于经验?谢谢 – pukimonstr
@pukimonstr几乎没有关于属性配置的文档。有时候,您必须尝试,查看源代码,进行调试以确定问题解决方案。 –