如何在本地运行时登录到控制台,并在使用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 

然后使用这个RoutingAppenderLogger -

logger.rolling.appenderRef.routing.ref = routingLogger 

同为RootLogger -

rootLogger.appenderRef.routing.ref = routingLogger 

日志的路由将基于isLocalMachine VM argument的值完成。如果isLocalMachine VM argumenttrue-DisLocalMachine=true),则在控制台中记录消息,否则在文件中记录消息。

因此,在您的本地开发环境中,您可以将此VM argument设置为true值以启用在控制台中的日志记录。对于服务器,无需设置此VM argument

+0

这与您所描述的一样。非常感谢! :D – pukimonstr

+0

嗨Vikas,请你指导我如何找到答案?你有没有找到一些文档,或者这是来自于经验?谢谢 – pukimonstr

+0

@pukimonstr几乎没有关于属性配置的文档。有时候,您必须尝试,查看源代码,进行调试以确定问题解决方案。 –