我需要以编程方式设置File appender.
我想在log4j2.xml上设置我的appenders 但是我想在运行时只编程(编程)到其中一个appender.
<Configuration status="WARN">
<Appenders>
<File name="File_1" fileName="c:/FILE_1.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="File_2" fileName="c:/FILE_2.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="File_3" fileName="c:/FILE_3.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="File_1"/>
<AppenderRef ref="File_2"/>
<AppenderRef ref="File_3"/>
</Root>
</Loggers>
Run Code Online (Sandbox Code Playgroud)
例:
if(condition.equals("A")){
//write log on File_1
}else if(condition.equals("B")){
//write log on File_2
}else {
//write log on File_3
}
Run Code Online (Sandbox Code Playgroud)
查看Internet中的各种教程,他们解释了如何在运行时以编程方式添加appender; 有没有办法在运行时选择只有一个在xml配置文件中定义的appender?
第一个解决方案:
我试图通过以下方式解决问题,但我对我的解决方案不满意,因为log4j2.xml中定义的文件没有以编程方式删除 …
当我使用log4j 2.1编译我的spring 3.2.9 web应用程序时,控制台中会出现此错误:
2015-02-02 12:08:25,213 ERROR appender Failover has no parameter that matches element Failovers
Run Code Online (Sandbox Code Playgroud)
我的理解是"故障转移"元素中不存在元素"故障转移",对吧?为什么会这样?我没有看到什么错,因为我有与log4j2手册相同的配置.
我在log4j2.xml中有这个配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="vcr-log4j2-config" status="debug">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>[%d{ISO8601}] %c [%C{1}] - %p: %m%n</Pattern>
</PatternLayout>
</Console>
<Syslog name="SYS_LOG" host="test_server.com" port="514"
protocol="UDP" facility="LOCAL7">
</Syslog>
<RollingFile name="backupApp"
fileName="C:/backup.log"
filePattern="C:/backup-%d{yyyy-MM-dd_HH-mm}.log.gz">
<PatternLayout>
<Pattern>[%d{ISO8601}] [%c] - %p: %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingFile>
<Failover name="FAILOVER" primary="SYS_LOG">
<Failovers>
<AppenderRef ref="backupApp"/>
</Failovers>
</Failover>
</Appenders>
<Loggers>
<Logger name="com.test.util.CustomLogger" level="info" additivity="false">
<AppenderRef ref="SYS_LOG" /> …Run Code Online (Sandbox Code Playgroud) 暂时忘记您为什么要这样做的问题 - 如果出于某种原因,两个 FileAppender 配置了相同的文件 - 这个设置会起作用吗?
我扩展了AppenderSkeleton以创建一个名为HTTPAppender的自定义appender,但是在xml文件中引用了它.Log4Net显然无法找到我的自定义appender.有没有办法从xml文件引用它指向我的项目,或者我是否必须将自定义appender的源代码添加到log4net中,以便将其打包在log4net.dll中?
调试时,我在立即窗口中收到以下错误:
log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [HTTPAppender] of type [HTTPAppender.HTTPAppender,HTTPAppender]. Reported error follows. System.IO.FileNotFoundException: Could not load file or assembly 'HTTPAppender' or one of its dependencies. The system cannot find the file specified. File name: 'HTTPAppender' at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName) at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) ...etc
这是xml文件的log4net部分:
<log4net>
<appender name="HTTPAppender" type="HTTPAppender.HTTPAppender,HTTPAppender">
<evaluator type="log4net.Core.LevelEvaluator,log4net">
<threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="#%level - %message" /> …
我想在特定的appender中输出我的包或类的日志输出.但是所有内容都打印到root-logger.
这是我的配置:
log4j = {
appenders {
console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
file name:'grailslog', file:'grails.log', threshold:org.apache.log4j.Level.DEBUG
file name:'mylog', file:'mylog.log', threshold:org.apache.log4j.Level.DEBUG
}
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
'org.codehaus.groovy.grails.web.sitemesh', // layouts
'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
'org.codehaus.groovy.grails.web.mapping', // URL mapping
'org.codehaus.groovy.grails.commons', // core / classloading
'org.codehaus.groovy.grails.plugins', // plugins
'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
'org.springframework',
'org.hibernate',
'net.sf.ehcache.hibernate'
warn 'org.mortbay.log'
debug 'grails.app'
debug mylog: 'my.package', additivity: true
root {
error 'grailslog'
additivity = true
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过这种语法:
log4j = {
appender.stdout = "org.apache.log4j.ConsoleAppender"
appender.'stdout.layout'="org.apache.log4j.PatternLayout" …Run Code Online (Sandbox Code Playgroud) 我正在尝试Log4j 2登录JTextPane.它应该像Netbeans IDE控制台中的STDERR或STDOUT(包括文本样式 - 颜色).
我知道我需要创建一个appender并连接它JTextPane,但我不知道它是如何使用的Log4j 2.
你有什么建议吗?
我感谢你的帮助,marty
我有两个appender.其中一个是DB appender,另一个是SMTPAppender.当我使用特殊标记记录字符串时,我想使用我的自定义db appender和SMTPAppender.但是我不希望每隔两天定义两个appender:
<logger name="com.MyClass" level="DEBUG" additivity="false">
<appender-ref ref="CUSTOM_DB"/>
<appender-ref ref="CUSTOM_EMAIL"/>
</logger>
Run Code Online (Sandbox Code Playgroud)
我想要一个特殊的参考,就像那样:
<appender-group ref="CUSTOM_COMBO">
<appender-ref ref="CUSTOM_DB"/>
<appender-ref ref="CUSTOM_EMAIL"/>
</appender-group>
<logger name="com.MyClass" level="DEBUG" additivity="false">
<appender-ref ref="CUSTOM_COMBO"/>
</logger>
Run Code Online (Sandbox Code Playgroud)
它应该都调用CUSTOM_DB和CUSTOM_EMAIL.我怎样才能在Logback with slf4j中做到这一点?
因为我必须登录自定义(单个)数据库表,所以我编写了一个自定义logback appender来扩展logback DBAppender.
我有一些单元测试验证appender工作正常,但是很快,因为我想在我的webapplication中配置appender,我得到了一个ch.qos.logback.core.util.IncompatibleClassException.我不知道为什么会这样.以前有人有这个例外吗?
版本:
logback-core : 1.0.13
logback-classic : 1.0.13
slf4j-api : 1.7.5
Run Code Online (Sandbox Code Playgroud)
logback.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" debug="true" scanPeriod="10 seconds">
<appender name="db" class="com.custom.common.logging.slf4j.Slf4jDbAppender">
<connectionSource class="ch.qos.logback.core.db.JNDIConnectionSource">
<jndiLocation>jdbc/logging</jndiLocation>
</connectionSource>
</appender>
<root level="INFO">
<appender-ref ref="db" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
例外:
2013-10-24 14:57:17 INFO AppenderAction About to instantiate appender of type [com.custom.common.logging.slf4j.LSlf4jDbAppender]
2013-10-24 14:57:17 ERROR AppenderAction Could not create an Appender of type [com.custom.common.logging.slf4j.LSlf4jDbAppender].
ch.qos.logback.core.util.IncompatibleClassException
at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:62)
at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:48)
at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:35)
at ch.qos.logback.core.joran.action.AppenderAction.begin(AppenderAction.java:54)
at ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:275)
at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:147)
at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:129) …Run Code Online (Sandbox Code Playgroud) 我有一个将日志发送到日志服务器存储的记录器。这工作正常,但不使用模式布局。有或没有这不会改变任何事情。我相信记得在某处阅读socketappender使用的是自己的模式而不是其他人的模式。
<appender name="LOGSTASH" class="org.apache.log4j.net.SocketAppender">
<param name="Port" value="5000"/>
<param name="RemoteHost" value="192.168.81.131"/>
<param name="ReconnectionDelay" value="5000"/>
<param name="LocationInfo" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud)
但是在这个文档(和其他一些)中使用这个。此文档中的示例:
<appender name="A1" class="org.apache.log4j.net.SocketAppender">
<param name="RemoteHost" value="localhost"/>
<param name="Port" value="5000"/>
<param name="LocationInfo" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud)
那么是不可能在socketappender 中使用个人模式还是我的错?
如果不可能,是否有其他附加程序用于使用自定义模式进行 tcp 日志记录?
我使用亚马逊的Java SDK创建了Amazon SQS和SNS logback appender.基本的appender使用同步Java API,但我也通过扩展ch.qos.logback.classic.AsyncAppender类创建了两者的异步版本.
使用异步appender停止logback记录器上下文不会按预期工作.当上下文停止时,所有异步appender都会在退出之前尝试刷新剩余事件.问题源于ch.qos.logback.core.AsyncAppenderBase#stop方法,它会中断工作线程.当Amazon SDK仍在处理排队事件并产生结果时触发中断com.amazonaws.AbortedException.在我的测试中,AbortedException当SDK处理来自API的响应时发生了这样的事情,因此实际的消息经历了,但情况可能并非总是如此.
即使工作者仍应处理剩余的事件队列,是否打算使用logback中断工作线程?如果是这样,我怎样才能解决AbortedException由中断引起的问题?我可以覆盖整个停止方法并删除中断,但这需要复制粘贴大部分实现.