您可以使用%logger {x}语法缩短记录器的名称,其中x控制缩短过程.有没有办法以同样的方式缩短线程的名称?
在我的Spring + Hibernate项目中,我使用LogBack通过SLF4J 1.6.4进行日志记录.现在,我添加了Ehcache 2.2.0(通过ehcache-spring-annotations-1.1.3).缓存似乎是作为方法工作,使用@Cacheable注释,不再执行,但返回正确的结果.但是,我有兴趣看到Ehcache写的日志.由于Ehcache也使用SLF4J,我想,日志应该写入我的日志文件中.但是,这种情况并没有发生.logback.xml具有以下内容.
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING"/>
</root>
Run Code Online (Sandbox Code Playgroud)
添加以下内容也无济于事
<logger name="net.sf.ehcache">
</logger>
Run Code Online (Sandbox Code Playgroud)
ehcache.xml中
<cache name="sampleCache1"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
/>
Run Code Online (Sandbox Code Playgroud)
请告诉我克服这个问题.
Ehcache正在使用SLF4J 1.6.1,而我的项目正在使用SLF4J 1.6.4.它会引起任何问题吗?
谢谢
匹配过滤器后可以修改日志事件吗?
我有一个Web容器(Jersey),它在ERROR级别记录未捕获的异常.但是,对于服务器(Jetty)抛出的某些异常(EofException),我想将它们记录在较低级别(INFO).
我可以使用与异常类型(EofException)匹配的Logback过滤器完全删除这些消息.但是我没有找到一种支持的方法来修改日志事件,例如,更改日志级别.
我需要为动态加载和重新加载的类动态创建Logback记录器和各种位.我有一些可变数量的这些类,尽管它会少于150个.性能是一个很大的问题,这是一个高度线程和极其并发的环境,所以使用MDC的想法不会飞,因为当出现问题时可能会有数千次调用.我也不想直接将记录器传递给类,我希望他们只需使用getLogger就可以将它们拉出来.
每个类都必须将所有错误消息记录到它自己的错误文件中,并将所有错误消息记录到它自己的跟踪文件中.这两个文件都需要每晚滚动.此外,系统中记录的任何内容也必须最终出现在主系统日志中.
我已经创建了以下代码片段来尝试这个想法.它看起来像它可以工作,但结果不是我所期望的.这是可以直接运行的测试程序:
package logbacktesting;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.filter.LevelFilter;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.LoggerFactory;
public class Main {
public static void main(String[] args) {
Logger templateLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.myapp");
LoggerContext loggerContext = templateLogger.getLoggerContext();
String[] nameList = new String[] {"test1.class", "test2.class"};
// Set up the pattern
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
// Spin over the names to create all the needed objects …Run Code Online (Sandbox Code Playgroud) 这是我的配置:
<appender name="myAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>mylogs.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>mylogs-%d{yyyy-MM-dd_HH-mm}.log</fileNamePattern>
<!-- keep 30 days' worth of history -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} [%thread] - %M:%L - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
Run Code Online (Sandbox Code Playgroud)
根据此处找到的logback文档(http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy),文件将根据我的%d{yyyy-MM-dd_HH-mm}fileNamePattern 每分钟翻转一次.
我观察了它是如何工作的,这是我的发现:
我错过了什么,我以为它会每分钟创建一个日志文件?
我正在使用Logback进行日志记录.Scribe appender将日志实时发送到中央Scribe聚合器.但我不知道如何在日志中为每个日志事件添加源机器IP.查看聚合的中央Scribe日志,几乎不可能知道哪台计算机正在发送日志.因此,将源计算机的IP附加到每个日志事件将会很有帮助,如果我们可以通过logback配置来控制它,那将非常好.
每次应用程序运行时如何创建新的日志文件?
我想以任何方式保留以前的日志.例如,我更愿意按创建时间和日期命名每个新日志文件.否则,我同意将旧日志文件备份到日期和时间文件名中.
不幸的是,我在这里看不到合适的政策和/或触发器:http://logback.qos.ch/manual/appenders.html
UPDATE
我做了大约如"复制"中说的那样
<appender name="ROUTINEAPPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/routine.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/routine%d{yyyyMMdd}%d{HHmmss,aux}.log</fileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="com.inthemoon.toolkit.StartupTimeBasedTriggeringPolicy" />
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} - %C{0} - %msg%n</pattern>
</encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)
但我的班级com.inthemoon.toolkit.StartupTimeBasedTriggeringPolicy从未被召唤过.我把断点放在start()方法中,但它从未提出过.
此外,不会发生滚动.日志文件已创建,但始终具有名称routine.log.
此外,我不明白,如何参数file和filenamePattern应该共存.
更新2
我有固定的UPDATE 1类参考,但仍然没有我需要的.在给定的解决方案中,日期时间将插入OLD日志文件名中.例如,如果我在2013年运行程序,它就会创建routine.log.然后我等了一年,并在2014年运行程序.将创建新的日志文件并具有名称routine.log,而OLD 2013日志将被放入routine2014XXXXXXXXXX.log,这是绝对无关紧要的.
我需要在每次程序启动时创建新文件,并将此文件标记为日期时间戳.
我正在使用的软件使用MDC来获取特定数据(用户名,IP,执行时间等).我希望一些日志使用某些MDC使用特定模式,而某些日志使用其他模式使用其他MDC.
我认为标记可以完成这项工作,我设置了不同的标记,比如说:PROFILE_MARKER - 用于配置文件日志AUDIT_MARKER - 用于审计日志
我的logback.xml配置文件中有3个appender,一个用于我的标记,另一个用于所有其他日志:
<configuration>
<appender name="profiler" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%t] [%X{USER}] [PROFILER] %-5p %m %X{TIME} ms %n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>PROFILER</marker>
</evaluator>
<onMismatch>DENY</onMismatch>
<onMatch>ACCEPT</onMatch>
</filter>
</appender>
<appender name="audit" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%t] [%X{USER}] [AUDIT] %-5p IP=%X{IP},ID=%X{ID} %m %n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>AUDIT</marker>
</evaluator>
<onMismatch>DENY</onMismatch>
<onMatch>ACCEPT</onMatch>
</filter>
</appender>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%t] [%X{USER}] %-5p %c - %m %n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>AUDIT</marker>
<marker>PROFILE</marker>
</evaluator>
<onMismatch>ACCEPT</onMismatch>
<onMatch>DENY</onMatch>
</filter>
</appender>
<root …Run Code Online (Sandbox Code Playgroud) 尽管使用Logback配置了Hibernate的特定日志记录,我的Spring Boot应用程序仍然在控制台中显示Hibernate查询,如下所示:
<appender name="HIBERNATE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGDIR}/hibernate.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGDIR}/hibernate.log.%d</fileNamePattern>
</rollingPolicy>
</appender>
<logger name="org.hibernate" additivity="false">
<appender-ref ref="HIBERNATE"/>
</logger>
<logger name="org.hibernate.SQL" additivity="false">
<appender-ref ref="HIBERNATE"/>
</logger>
<logger name="org.hibernate.type.descriptor.sql" additivity="false">
<appender-ref ref="HIBERNATE"/>
</logger>
Run Code Online (Sandbox Code Playgroud)
它会将Hibernate的日志(包括查询)发送到文件hibernate.log.但我还想避免在控制台中进行查询,我认为应该使用此配置进行查询.
我错过了什么?
我正在尝试以一种方式管理我的日志记录,在这种方式中,我的最旧的归档日志文件一旦达到总累积大小限制或达到其最大历史记录限制就会被删除.当使用SizeAndTimeBasedRollingPolicy中的logback 1.1.7,滚动文件附加目的地将继续,尽管超出的创造新的档案totalSizeCap集.
这是我的logback.xml文件供参考:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${USERPROFILE}/testlogs/test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${USERPROFILE}/testlogs/%d{yyyy-MM-dd_HH}/test%i.log.zip
</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>50KB</maxFileSize>
<totalSizeCap>200KB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p - %m%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="file" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这是logback中的错误还是我没有正确配置滚动文件appender?