在使用log4j.properties时写if(log.isDebugEnable){……} 与不写有什...

log4j问题,在log4j.properties中生成日志路径是这样写的: log4j.appender.logfile.File=/mail.log_百度知道
log4j问题,在log4j.properties中生成日志路径是这样写的: log4j.appender.logfile.File=/mail.log
在bin目录启动tomcat以后,mail.log生成在tomc激辅篙盒蕻谷戈贪恭楷at所在盘符根目录下,而不是在tomcat的bin目录下,这是为什么
提问者采纳
${catalina.home}/logs/mai激辅篙盒蕻谷戈贪恭楷l.log才是生成在tomcat的logs目录下
我想知道,即使不这样写,光写一个/mail.log,不是应该生成在项目的根目录下吗,现在问题是怎么会生成在盘符根目录下了
断点了半天源码也没看到path在哪,反正/mail.log就是分区根目录,没有问什么,不知道你怎么会理解成项目根目录,${webapp.root}才是项目根目录
提问者评价
其他类似问题
log4j的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁java中如何使用log4j将日志信息写入数据库中(转)_百度知道
java中如何使用log4j将日志信息写入数据库中(转)
提问者采纳
# Log4j建议只使用四个级别.DATABASE,这里我的数据库举动是用的JTDS: 日志信息级别%m.user=usernamelog4j,优先级从高到低分别是ERROR、ALL或者您定义的级别、WARN、DEBUG;1、DEBUG.WARN&quot.properties文件.rootLogger=ERROR: 是日志记录的优先级;DatabaseName=databasenamelog4j.appender: 产生的日志具体信息 %n;%d{yyyy-MM-dd HH., &#39.driver=net,分为OFF;: 日志信息所在地(类名)%p.org.jdbc:mm.DATABASE:ss}&#39,[Lg_Thread]02[varchar]02(50)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,class.DATABASE=org.Driverlog4j.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n3.apache、ERROR.appender.sourceforge.DATABASE;)# 写入数据库中的表LOG4J的Message字段中, &#39,%p&#39,[Lg_Message]02[varchar]02(2000)02COLLATE02Chinese_PRC_CI_AS02NOT02NULLGO02022:引用# level .jtds.appender、INFO;%m',[Lg_Class]02[varchar]02(200)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,DATABASElog4j;以上级别在数据库存储(默认情况使用rootLogger中的设置)log4j.password=password# 本处设置为&quot.layout:jtds,[Lg_Date]02[datetime]02NOT02NULL02:&#47.DATABASE;%t'&#47.appender.appender, &#39.在程序中需要将日志信息写入数据库的地方写入如下代码。log4j.写log4j.DATABASE.PatternLayoutlog4j.JDBCAppenderlog4j.DATABASE.Threshold=DEBUGlog4j.jdbc、WARN.创建日志数据表, &#39.layout=org:view plainprint、INFO;localhost,thread.URL=jdbc.apache=true# 用于数据库log4j,# 内容%d(日期)%c,[Lg_Level]02[varchar]02(20)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02.appender: 输出日志信息换行log4j,message) VALUES (&#39.DATABASE:sqlserver.log4j.%l&#39:1433.DATABASE、FATAL.sql=INSERT INTO log(optime.appender:view plainprint.log4j.appender?CREATE02TABLE02log02([Id]02[int]02IDENTITY02(1,021)02primary02key02NOT02NULL02
其他类似问题
log4j的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁slf4j + logback 日志模型_小组_ThinkSAAS
slf4j + logback 日志模型
slf4j + logback 日志模型
Logback日志系统配置攻略:
经常找不到配置文件信息;
slf4j由log4j作者Ceki开发,逐步取代apahce commons logging。
logback由log4j作者Ceki开发,逐步取代log4j。
学习网站:
19.2.2. slf4J与旧日志框架的关系
slf4j等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。
logback-classic(默认的logback实现)
slf4j-jcl.jar(apache commons logging)
slf4j-logj12.jar(log4j 1.2.4)
slf4j-jdk14(java.util.logging)
将所有使用旧式日志API的第三方类库或旧代码的日志调用转到slfj。
jcl-over-slf4j.jar/jcl104-over-slf4j
apache commons logging 1.1.1/1.0.4,直接替换即可。
log4j-over-slf4j.jar
log4j,直接替换即可。
jul-to-slf4j
jdk logging,需要在程序开始时调用SLF4JBridgeHandler.install()来注册listener
参考JulOverSlf4jProcessor,可在applicationContext.xml中定义该bean来实现初始化。
注意原有的log4j.properites将失效,logback网站上提供转换器,支持从log4j.properties 转换到logback.xml 。
19.2.3. logback.xml的功能与配置
&substitutionProperty name="log.base"value="../logs/helloworld"/&
JMX管理,logback支持使用JMX随时重载logback.xml或者单独设置某个package的level。
&jmxConfigurator /&
Appender配置
Rolling每天生成一个日志文件,方便按日期翻查。日志文件会自动压缩,定义文件名pattern时加上.zip即可。
Encoding默认为平台的编码,建议Console Appender使用默认值。
Tomcat和Glassfish中,设定日志路径为../logs/xxxx.log 都能将日志放入应用服务器本身的logs目录。
&appender name="logfile"class="ch.qos.logback.core.rolling.RollingFileAppender"& &Encoding&UTF-8&/Encoding& &File&${log.base}.log&/File& &rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"& &FileNamePattern&${log.base}.%d{yyyy-MM-dd}.log.zip&/FileNamePattern& &/rollingPolicy& &layout class="ch.qos.logback.classic.PatternLayout"& &pattern&%date [%thread] %-5level %logger{80} - %msg%n&/pattern& &/layout& &/appender&
特别设置某个logger打印到特殊的log文件。注意,logger的appender默认是叠加的,如果没有设置additivity="false",会同时打印到stdout,logfile和webservice-logfile中。
&logger name="org.apache.cxf.interceptor.LoggingOutInterceptor"additivity="false"& &level value="INFO"/& &appender-ref ref="webservice-logfile"/& &/logger&
19.2.4. slf4j和logback的使用
如果日志的参数超过3个,需要写成
Object[] params = {newVal, below, above}; logger.debug("Value {} was inserted between {} and {}.", params);
commons-logging 和slf4j的代码比较:commons-logging 示例代码:
import mons.logging.L import mons.logging.LogF public class TestLog { Log log = LogFactory.getLog(TestLog.class); public void print() { if (log.isDebugEnabled()) { log.debug (sql); log.debug ("My name is"+ name +", I am"+ age +"years old."); } } }
slf4j的示例代码: import org.slf4j.L import org.slf4j.LoggerF public class TestLogBySlf4J { Logger logger = LoggerFactory.getLogger(TestLogBySlf4J.class); public void print() { logger.debug(sql); logger.debug("My name is {}, I am {} years old.", name, age); } }
因为内部已优化,作者认为slf4j的logger不需要定义为static。
可设置缓存后批量写日志文件(但服务器如果重启,可能会丢失未写到磁盘的记录)
MDC,用Filter,将当前用户名等业务信息放入MDC中,在日志format定义中即可使用该变量。
JMS Appender用于告警, DB Appender用于业务日志等
可以使用插件,如生成Log代码的Eclipse插件Log4E。
19.2.5. 选型
使用log4j作者的新作logback+slf4j,因为可以参数化的语句,不用再为了丁点性能写什么 if( logger.isDebugenable()) ....另外logback的整体性能也较佳,Hibernate、Jetty等项目已经迁移到了slf4j。
特别注意使用commons logging + log4j的第三方框架的日志操作会被拦截并转发到logback中,因此原有的log4j.properties文件将失效,真正配置文件为logback.xml。
而原来使用java.util.logging的第三方框架(如CXF),使用JulOverSlf4jProcessor进行拦截。
logback.xml与log4j.xml很像,详细配置见日志的资料。
tomcat和glassfish中,设定日志路径为../logs/xxxx.log 都能将日志放入应用服务器本身的logs目录。
slf4j由log4j作者Ceki开发,逐步取代apahce commons logging。
logback由log4j作者Ceki开发,逐步取代log4j。
学习网站:/ceki/logback
19.2.1. 优势
十个转移到logback的理由
slf4j支持参数化的logger.error("帐号ID:{}不存在", userId);告别了if(logger.isDebugEnable()) 时代。
另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j:
"某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LOGBack中需要3纳秒,而在Log4J中则需要30纳秒。 LOGBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。"
用户评论(0)
开发技术学习小组列表
PHP开发框架
缓存Memcache
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。1085人阅读
在JavaSE中使用log4j来个性化控制日志,需求为:
1.将Warning以上级别的log记录到error log中。
2.将正常的Info信息记录到info log中。
3.将Debug信息记录到trace log中。
4.log信息尽可能详细,并且格式简明易读,关键内容包括:包名,类名,方法名,调用参数,异常信息,出错行数等等。
每种log最多保留10个日志文件,超过10个文件时最老的log被删除,实现滚动记录日志,日志文件命名格式为:“*_0.log”,&*_1.log&...&*_9.log&。单个log文件最大容量10MB。
log4j配置文件log4j.xml如下:
&?xml version=&1.0& encoding=&UTF-8& standalone=&no&?&
&!DOCTYPE log4j:configuration SYSTEM &log4j.dtd&&
&log4j:configuration xmlns:log4j=&http://jakarta.apache.org/log4j/& debug=&false& threshold=&null&&
&!--This is final xml4j that confirms xml4j.dtd--&
&appender class=&com.log4j.test.TestLoggingRollingFileAppender& name=&error&&
&param name=&threshold& value=&WARN&/&
&param name=&File& value=&/var/opt/test/log/test_error0_0.log&/&
&param name=&Append& value=&true&/&
&param name=&maxFileSize& value=&10MB&/&
&param name=&maxBackupIndex& value=&10&/&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d{yyyy-MM-dd-'T'HH:mm:ss.SSSZ} | ${host} | %x | %-15t | %-5p | %c | %m%n&/&
&filter class=&org.apache.log4j.varia.LevelRangeFilter&&
&param name=&LevelMin& value=&WARN& /&
&param name=&LevelMax& value=&FATAL& /&
&/appender&
&appender class=&com.log4j.test.TestLoggingRollingFileAppender& name=&info&&
&param name=&threshold& value=&INFO&/&
&param name=&File& value=&/var/opt/test/log/test_info0_0.log&/&
&param name=&Append& value=&true&/&
&param name=&maxFileSize& value=&10MB&/&
&param name=&maxBackupIndex& value=&10&/&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d{yyyy-MM-dd-'T'HH:mm:ss.SSSZ} | ${host} | %x | %-15t | %-5p | %c | %m%n&/&
&filter class=&org.apache.log4j.varia.LevelRangeFilter&&
&param name=&LevelMin& value=&INFO& /&
&param name=&LevelMax& value=&INFO& /&
&/appender&
&appender class=&com.log4j.test.TestLoggingRollingFileAppender& name=&trace&&
&param name=&threshold& value=&DEBUG&/&
&param name=&File& value=&/var/opt/test/log/test_trace0_0.log&/&
&param name=&Append& value=&true&/&
&param name=&maxFileSize& value=&10MB&/&
&param name=&maxBackupIndex& value=&10&/&
&layout class=&org.apache.log4j.PatternLayout&&
&param name=&ConversionPattern& value=&%d{yyyy-MM-dd-'T'HH:mm:ss.SSSZ} | ${host} | %x | %-15t | %-5p | %c | %m%n&/&
&/appender&
&logger additivity=&true& name=&com.log4j.test&&
&level value=&INFO&/&
&appender-ref ref=&error&/&
&appender-ref ref=&info&/&
&appender-ref ref=&trace&/&
&level value=&INFO&/&
&appender-ref ref=&error&/&
&appender-ref ref=&info&/&
&appender-ref ref=&trace&/&
&/log4j:configuration&
由于log4j默认的RollingFileAppender滚动记录日志功能文件名格式是:”*.log1“,”*.log2“等不满足需求中“*_0.log”,&*_1.log&...&*_9.log&格式,因此自定滚动日志记录类,实现自定义的log序号格式如下:
log4j.xml配置文件中的如下配置指定了log文件的存放目录和名称格式:
&param name=&File& value=&/var/opt/test/log/test_error0_0.log&/&
&param name=&File& value=&/var/opt/test/log/test_info0_0.log&/&
&param name=&File& value=&/var/opt/test/log/test_trace0_0.log&/&使用下面自定义的log文件滚动追加类,可以实现日志文件命名格式为:“*_0.log”,&*_1.log&...&*_9.log&,并且log4j在记录日志时,当前记录的文件序号总是0_0:
class TestLoggingRollingFileAppender extends RollingFileAppender {
private static final String FILE_NAME_POSTFIX = &_0.log&;
public TestLoggingRollingFileAppender() {
public TestLoggingRollingFileAppender(Layout layout, String filename, boolean append) throws IOException {
super(layout, filename, append);
public TestLoggingRollingFileAppender(Layout layout, String filename) throws IOException {
super(layout, filename);
//重写log4j RollingFileAppender的滚动记录log方法,log文件写满时,自动写新文件,log4j默认文件名规则为:*.log0, *.log1...
//将log文件名规则修改为:*_0.log, *_1.log...该方法在每个日志文件写满时由log4j自动调用
public void rollOver() {
if (qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
LogLog.debug(&rolling over count=& + size);
LogLog.debug(&maxBackupIndex=& + maxBackupIndex);
boolean renameSucceeded =
//配置的log文件数目大于0
if (maxBackupIndex & 0) {
//获取最老的log文件名,序号最大的是最老的log文件
file = new File(fileName.substring(0, fileName.length() - FILE_NAME_POSTFIX.length()) + '_' + maxBackupIndex + &.log&);
//删除最老的log文件,不一定存在最老文件,只有当log文件个数等于所配置的最大日志文件数时才删除最老日志文件
if (file.exists()) {
renameSucceeded = file.delete();
//将log文件名的序号加1,如*_2.log变为*_3.log,即最新的log会记录在序号最小的log文件中
for (int i = maxBackupIndex - 1; i &= 1 && renameS i--) {
//获取log文件名
file = new File(fileName.substring(0, fileName.length() - FILE_NAME_POSTFIX.length()) + '_' + i + &.log&);
if (file.exists()) {
//将log文件名的序号加1,最小的序号是2
target = new File(fileName.substring(0, fileName.length() - FILE_NAME_POSTFIX.length()) + '_' + (i + 1) + &.log&);
LogLog.debug(&Renaming file & + file + & to & + target);
renameSucceeded = file.renameTo(target);
//将最新写满的log文件命名为序号1
if (renameSucceeded) {
//命名*_1.log文件
target = new File(fileName.substring(0, fileName.length() - FILE_NAME_POSTFIX.length()) + '_' + 1 + &.log&);
this.closeFile();
file = new File(fileName);
LogLog.debug(&Renaming file & + file + & to & + target);
renameSucceeded = file.renameTo(target);
//log文件重命名失败,重新打开log文件继续向里面追加log
if (!renameSucceeded) {
this.setFile(fileName, true, bufferedIO, bufferSize);
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
LogLog.error(&setFile(& + fileName + &, true) call failed.&, e);
//所有的log文件都改名成功
if (renameSucceeded) {
//关闭所有滚动的log文件
this.setFile(fileName, false, bufferedIO, bufferSize);
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
LogLog.error(&setFile(& + fileName + &, false) call failed.&, e);
}上述日志文件滚动改名方法中,由于当前记录的日志文件序号总是从0开始,因此要依次顺序地日志文件序号加1,以实现序号滚动。
定义自己的log记录类,读取log4j.xml配置文件,调用log4j相应log记录方法,实现自定义格式的log。
public class TestLog{
private static final String LOGGER_NAME = &com.log4j.test&;
private static final String LOG_PATH = &/etc/opt/log4j_test/conf/&
private static final String LOG_CONF_NAME = &log4j.xml&;
private static final String ERROR_LOG_ENTRY_SEPARATOR = &, &;
private static final String EMPTY_STRING = new String();
private static Logger log =
//Initialize and load log configuration
//先从服务器上指定位置加载log4j配置文件
File file = new File(LOG_PATH + LOG_CONF_NAME);
if(file.exists()){
DOMConfigurator.configure(Constants.RAC3GP_CONF_DIR + LOG_CONF_NAME);
//如果服务器上指定位置log4j配置文件不存在,加载jar包中的log4j配置文件
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(LOG_CONF_NAME);
new DOMConfigurator().doConfigure(in, LogManager.getLoggerRepository());c
} catch (Exception e) {
System.err.println(&Loading log4j configuration failed, errorMsg:& + e.getMessage());
log = Logger.getLogger(LOGGER_NAME);
log.trace(&Log initializing ...&);
public static void logAudit(String message) {
(message);
public static void logTrace(String message)
log.debug(message);
public static void logError(Object location, String method, String errorMessage)
logError(location, method, null, errorMessage);
public static void logError(Object location, String method, Exception exp, String errorMessage)
String className = location.getClass().getName();
if( errorMessage == null )
errorMessage = &&;
String errorMsg = className + & & + method + &: & + errorM
StringBuffer msg = new StringBuffer(errorMsg);
if (exp != null)
msg.append(Constants.NL).append(Constants.NL).append(
getStackTrace(exp));
msg.append(getStackTrace(new BulkCmException()));
log.error(msg);
public static void logError(Object location, String method, Exception exp, String sessionId, String errorMessage)
String msg = sessionId + ERROR_LOG_ENTRY_SEPARATOR + errorM
logError(location, method, exp, msg);
private static String getStackTrace(Throwable t)
if (t == null)
return EMPTY_STRING;
StringWriter localSw = new StringWriter();
PrintWriter localPw = new PrintWriter(localSw);
t.printStackTrace(localPw);
return localSw.toString();
catch (Throwable u)
return EMPTY_STRING;
public static void logInfo(Object location, String message)
String className = location.getClass().getName();
String msg = className + &: & +
public static void logInfo(String message)
(message);
}在应用程序中,直接调用该log类的日志记录方法即可实现自定义log记录需求。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:466170次
积分:6465
积分:6465
排名:第1127名
原创:170篇
转载:17篇
评论:180条
(1)(2)(3)(2)(2)(2)(1)(6)(2)(6)(7)(2)(7)(5)(20)(2)(2)(8)(1)(5)(3)(1)(10)(6)(11)(14)(4)(6)(14)(20)(8)(4)(2)}

我要回帖

更多关于 log4j.properties 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信