Java 排除默认的日志文件

Java 排除默认的日志文件,java,mysql,logback,jboss6.x,Java,Mysql,Logback,Jboss6.x,我的团队正在开发一个具有每秒高呼叫率的电信实时应用程序我们使用logback根据键值匹配筛选日志(流量实时值,如呼叫方等)。一旦验证了live值和db值的匹配,过滤后的日志文件将正确创建,但是我们将放弃默认文件,该文件在没有匹配时填充日志。在进行键值匹配之前,可能需要对流量节点进行一段时间的监视,因此在此期间,默认值可能会无限期地增大,并对节点本身的性能和稳定性造成问题我应该在logback.xml中做些什么来避免生成默认日志文件?可能吗?还有其他方法可以达到同样的效果吗 logback.xml

我的团队正在开发一个具有每秒高呼叫率的电信实时应用程序我们使用logback根据键值匹配筛选日志(流量实时值,如呼叫方等)。一旦验证了live值和db值的匹配,过滤后的日志文件将正确创建,但是我们将放弃默认文件,该文件在没有匹配时填充日志。在进行键值匹配之前,可能需要对流量节点进行一段时间的监视,因此在此期间,默认值可能会无限期地增大,并对节点本身的性能和稳定性造成问题我应该在logback.xml中做些什么来避免生成默认日志文件?可能吗?还有其他方法可以达到同样的效果吗

logback.xml

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



提供的FL类仅适用于在FL模块中具有java鉴别器的SK。

您已经定义了此根记录器:

<root level="DEBUG">
    <appender-ref ref="SIFT_LOGGER" />              
    <appender-ref ref="STDOUT" />
</root>
STDOUT
appender是一个控制台appender,因此它实际上不会写入日志文件,而是写入
System.out
。我怀疑您在某个文件中看到这些日志事件的原因是,运行应用程序的任何东西都将
System.out
重定向到一个文件。只要根记录器定义中只有
SIFT_APPENDER
,您就可以确信这将是唯一的APPENDER。注意:从根记录器中删除appender后,可能会从logback.xml中删除它,因为它是未使用的

更新1:根据您上次的评论,我现在了解到您希望丢弃到达筛选附加程序但与给定条件不匹配的日志。我怀疑这里发生的事情是,一些日志事件到达筛选附加程序时带有
serviceKey
的“未知”值,然后这些事件被写入
/var/log/tit/logback\u[unknownValue]\u%d{yyyyy-MM-dd}\u%I.log
。这是问题的关键吗?如果是这样,那么您可以在嵌套的appender中添加一个过滤器。以下是一些例子:

  • 使用Groovy表示“包含未知serviceKey条件”:

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <!-- GEventEvaluator requires Groovy -->
         <evaluator
            class="ch.qos.logback.classic.boolex.GEventEvaluator">
           <expression>
             serviceKey == null
           </expression>
         </evaluator>
         <OnMismatch>NEUTRAL</OnMismatch>
         <OnMatch>DENY</OnMatch>
    </filter> 
    
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
         <!-- JaninoEventEvaluator requires Janino -->
         <evaluator
           class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
           <expression>
             serviceKey == null
           </expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter> 
    
    
    serviceKey==null
    中立的
    否认
    
  • 使用Janino表示“包含未知serviceKey条件”:

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <!-- GEventEvaluator requires Groovy -->
         <evaluator
            class="ch.qos.logback.classic.boolex.GEventEvaluator">
           <expression>
             serviceKey == null
           </expression>
         </evaluator>
         <OnMismatch>NEUTRAL</OnMismatch>
         <OnMatch>DENY</OnMatch>
    </filter> 
    
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
         <!-- JaninoEventEvaluator requires Janino -->
         <evaluator
           class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
           <expression>
             serviceKey == null
           </expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter> 
    
    
    serviceKey==null
    中立的
    否认
    
当这些过滤器中的任何一个到位时,任何到达筛选附件并具有“未知”服务密钥的日志事件都将被忽略。注意:我已将“包含未知serviceKey条件”写为
serviceKey==null
您的逻辑可能不同,但上面的示例显示了您应该如何告诉Logback为您应用此筛选器。

仅通知@glitch(以及所有感兴趣的其他人)这个问题的令人高兴的结论是:我成功地使标记表达式工作如下:

<expression>mdc.get("servicekey") == null</expression>
mdc.get(“servicekey”)==null
由于这个表达式,我得到了想要的行为:当密钥与运行时流量值不匹配时,不会生成默认文件“IS_UNDEFINED”

原因是因为JaninEventEvaluator中的事件类型是LoggingEvent,它有一个保留对象“mdc”(类型是Map)

问候,,
Pierluigi

必须将过滤器移动到常规筛选附加器

<appender name="SIFT-TRACE"
    class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator
        class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
        <Key>loggerFileName</Key>
        <DefaultValue>unknown</DefaultValue>
    </discriminator>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator
            class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
            <expression>
                mdc.get("loggerFileName")!=null
            </expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>NEUTRAL</OnMatch>
    </filter>
    <sift>
        <appender name="TRACE-${loggerFileName}"
            class="ch.qos.logback.core.FileAppender">

            <File>D:/U/${loggerFileName}.log</File>
            <Append>true</Append>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d [%thread] %level %mdc %logger - %msg%n</Pattern>
            </layout>
        </appender>
    </sift>
</appender>

<logger name="org.springframework" level="DEBUG" />

<root level="DEBUG">

    <appender-ref ref="SIFT-TRACE" />
</root>


您是否可以包括您的logback配置,例如logback.xml或logback.groovy文件。此外,如果您的问题可以从提供代码中获益,那么您可能可以将代码内联而不是作为附件。我知道STDOUT指向我们环境中称为server.log的内容,其中包括标准日志和打印logback日志。此logback.xml生成的是一个文件,名为(例如)logback_1_%d{yyyy MM dd}%i.log,当使用
servicekey
进行传入呼叫时(这是我们的密钥)of值1生成与存储在DB中的值的匹配。这是需要的。不需要的是当
servicekey
不生成匹配时生成的文件:在这种情况下,会生成一个默认文件来收集每一个其他传入呼叫。这可能很危险。@Pierluigi我怀疑这里发生的是一些错误g事件到达筛选附加程序时,serviceKey的值为“未知”,然后将这些事件写入
/var/log/tit/logback.[unknownValue].%d{yyyy-MM-dd}_%i、 日志
。这是问题的症结所在吗?如果是的话,我已经用一个解决方案更新了我的答案。您好,我们已经对您的解决方案进行了广泛的测试,但我们仍然无法避免默认文件创建。默认文件是用这个名称创建的
logback\u sk\u**serviceKey\u未定义**2017-09-28\u 0。日志
不确定如何回复。我将我在回答中提出的解决方案改编自我不久前参与的一个项目中的一个非常类似的情况。在该项目中,我成功筛选并丢弃了筛选器中不符合我“感兴趣”条件的日志事件。很遗憾,您无法使其正常工作。因此,
[unknownValue]
似乎是serviceKey\u未定义。任何尝试使其工作的操作都失败了(
==null,==*未定义*,==serviceKey\u未定义
)。我们可能需要创建自己的评估器吗?
public void handle()
{
    MDC.put("loggerFileName","some value");
    ...
    MDC.remove("loggerFileName");
}