2016-07-14 88 views
4

我有几个可执行类,我想自动日志文件名设置为正在执行的Java类的名称。的logback:使用Java主类名作为日志文件名

我知道我可以用编程的方式做到这一点,可能使用Reflection和MDC,但是通过配置logback.xml没有更简单的方法来实现这一点吗?

这似乎是一个相当基本的需要我,所以我很惊讶,我找不到任何关于它的文档。

回答

2

所以,你可以从显示在1类和类2到一个记录仪与包名this.getClass()收集所有的日志com.company(1类和类2分享这个命名空间)支持它,否则,你需要在你的所有main中的方法的logback可以用它来设置一个类似的系统属性,你可以使用这个属性

<file>${sun.java.command}.log</file> 

+0

谢谢。在Windows上通过Eclipse启动时,此属性似乎不受支持,但在通过Maven在Ubuntu上启动时可以使用此属性。我得到一个字符串,例如'org.codehaus.plexus.classworlds.launcher.Launcher exec:java -Dexec.mainClass = mypackage.MyMainClass',并且有一些清理我应该能够隔离类名。 – Alphaaa

-1

正如你提到的,你可以很容易地通过执行实现这一目标:
Logger loggerA = LoggerFactory.getLogger(this.getClass().getSimpleName());

我认为这是相当舒适的设置,所以的logback不与允许显式xml配置打扰。如果你在一个JVM

<appender name="MY_STUFF" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <encoder> 
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern> 
     </encoder> 

     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>${LOG_DIR}/my_log.server_%d{yyyy-MM-dd}.log</fileNamePattern> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
    </appender> 

    <logger name="com.company" level="INFO" additivity="false"> 
     <appender-ref ref="MY_STUFF" /> 
    </logger> 
+0

'LoggerFactory.getLogger '只是返回一个名为传递字符串的记录器,但它不会影响'FileAppender'的日志文件名。即使我设法将日志文件名设置为等同于记录器名称,那也不是我想要的:每个类都会记录到一个单独的文件,而我希望所有类都会记录到一个名为正在执行的主类的文件。 – Alphaaa

+0

您更正了,它不会影响FileAppender的日志文件名。就在你的'logback.xml'使用的命名空间,其中将包括在您创建'LoggerFactory.getLogger'所有记录器(例如com.company.yourclass): '<记录器名称=“com.company”级=” INFO”相加= “假”> <附加器-REF REF = “附加器”/> '我是否正确地理解? – Stas

+0

让我试着用一个例子来解释我需要的东西。如果我执行'Class1.java',在执行过程中调用_all_ classed应该记录到* class1.log *。如果明天我创建并运行一个名为'Class2.java'的新可执行类,则该执行中的所有内容都应该放入* class2.log *中,而不必更改任何设置。现在有道理吗? – Alphaaa

0

如果你不介意在你的命令行指定两次的应用程序名称,您可以指定一个java系统变量是您所选择的应用程序名称,并说明你的logback配置文件系统变量。

例如,你的命令

java -DAPPNAME="Class1" Class1 

...传递价值 “的Class1” 作为的logback拿起一个Java系统变量,您可以重复这样的...

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>${APPNAME}.log</file> 
    <encoder> 
     <pattern>%msg%n</pattern> 
    </encoder> 
</appender> 
相关问题