使用两个属性

时间:2015-11-17 05:11:38

标签: java logback

我的问题是:我的应用程序维护了三个建筑物,每个建筑物都有不同的过程。

所以,使用logback,我想创建一个具有规范的日志: 每个建筑物都有一个特定的文件夹,在每个建筑物的特定文件夹中,会有很多日志文件,每个日志文件都表示一个过程。

我的logback.xml现在是:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<appender name="logAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
        <key>processName</key>
        <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
        <appender name="FILE-${processName}"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>logs/${distributor}/${processName}.log</file>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
            </layout>
            <rollingPolicy
                class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>logs/${distributor}/${processName}.%i.log</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>10</maxIndex>
                <!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
                    <maxFileSize>5KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> -->
            </rollingPolicy>
            <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>10MB</maxFileSize>
            </triggeringPolicy>
        </appender>
    </sift>
</appender>

<logger name="processLog" level="debug" additivity="false">
    <appender-ref ref="logAppender" />
    <appender-ref ref="stdout" />
</logger>

<root level="debug">
    <appender-ref ref="stdout" />
    <appender-ref ref="logAppender" />
</root>
</configuration>

我的java servlet代码是:

public class DistributorServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;

   private static Logger processLog = LoggerFactory.getLogger("processLog");

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String office = req.getParameter("office");
      MDC.put("distributor", office);
      String process = req.getParameter("process");
      MDC.put("process", process);
      processLog.debug("Processing");
   }
}

但是,不会生成日志文件。

任何人都可以帮助我吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

1。进行以下更改

private static Logger processLog = LoggerFactory.getLogger("processLog");

private static Logger processLog = LoggerFactory.getLogger(DistributorServlet .class);

2。为经销商添加额外的鉴别器

在logback.xml中,似乎只添加了一个discriminator。您是否尝试为distributor

添加另一个

3。别忘了

在使用后添加MDC.remove("keyName");

4。如果您发现多个MDC密钥出现问题

我在MDC.put尝试添加多个密钥时遇到了问题。 (我想知道为什么没有定义putAll

虽然底层实现是应该允许添加多个键的HashMap<Key k, Value v>的实现,但我只能看到放入MDC的最后一个键将应用于logback.xml

对于其他键,我发现_IS_UNDEFINED值会被追加。

当然,你可以再次参考其他各种链接,虽然这可能不是一个好主意,但这是我在Java代码中所做的,

System.setProperty("distributor", req.getParameter("office"));

System.setProperty("process", req.getParameter("process"));

通过删除鉴别器来修改logback.xml。好吧,或者您可以删除上述属性之一并具有该属性的MDC.put。

但请参阅链接System.setProperty is safe in java?

或者我建议https://stackoverflow.com/a/32615172/3838328