log4j有关

转自:https://my.oschina.net/wej/blog/757826
http://blog.csdn.net/memray/article/details/17488433

网上可以很容易搜到解决此问题的方案,基本为两种,一种修改tomcat的catalina.sh文件,另外一种是通过log4j,但是网上的是配置的log4j1的

先来看看项目最开始写的log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
	<properties>
		<!-- 基本的文件的输出信息的配置 -->
		<property name="LOG_HOME">/opt/aspire/product/migu_cdps/logs</property>
		<!-- 日志备份目录 -->
		<property name="SERVER_NAME">migu_cdps</property>
		<property name="SERVER_ERROR_NAME">migu_cdps_error</property>
	</properties>
	<appenders>
		<!-- 定义控制台输出 -->
		<Console name="CONSOLE" target="SYSTEM_OUT">
			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n" />
		</Console>
		<!-- 全量日志 -->
		<RollingFile name="ROLLING" fileName="${LOG_HOME}/${SERVER_NAME}.log" filePattern="${LOG_HOME}/${SERVER_NAME}_%d{yyyy-MM-dd}_%i.log">
			<PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
				<SizeBasedTriggeringPolicy size="102400 KB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
			<Filters>
				<!--<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>-->
				<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
		<!-- 错误日志-->
		<RollingFile name="ROLLING_ERROR" fileName="${LOG_HOME}/${SERVER_ERROR_NAME}.log" filePattern="${LOG_HOME}/${SERVER_ERROR_NAME}_%d{yyyy-MM-dd}_%i.log">
			<PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
				<SizeBasedTriggeringPolicy size="51200 KB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
			<Filters>
				<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
	</appenders>
	<loggers>
		<!-- show sql-->
		<logger name="com.migu.cdps.dao" level="info"/>
		<root level="info">
			<appender-ref ref="CONSOLE" />
			<appender-ref ref="ROLLING"/>
			<appender-ref ref="ROLLING_ERROR"/>
		</root>
	</loggers>
</configuration>

增加catalina.out的日志控制

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
	<properties>
		<!-- 基本的文件的输出信息的配置 -->
		<property name="LOG_HOME">/opt/aspire/product/migu_cdps/logs</property>
		<property name="CATALINA_BASE">/opt/aspire/product/migu_cdps/apache-tomcat-7.0.64/logs</property>
		<!-- 日志备份目录 -->
		<property name="SERVER_NAME">migu_cdps</property>
		<property name="SERVER_ERROR_NAME">migu_cdps_error</property>
	</properties>
	<appenders>
		<!-- 定义控制台输出 -->
		<Console name="CONSOLE" target="SYSTEM_OUT">
			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
		</Console>

		<!-- catalina.out -->
		<RollingFile name="CATALINA_BASE_ROLLING" fileName="${CATALINA_BASE}/catalina.out" filePattern="${CATALINA_BASE}/catalina_%d{yyyy-MM-dd}_%i.log">
			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
				<SizeBasedTriggeringPolicy size="102400 KB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
		</RollingFile>

		<!-- 全量日志 -->
		<RollingFile name="ROLLING" fileName="${LOG_HOME}/${SERVER_NAME}.log" filePattern="${LOG_HOME}/${SERVER_NAME}_%d{yyyy-MM-dd}_%i.log">
			<PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
				<SizeBasedTriggeringPolicy size="102400 KB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
			<Filters>
				<!--<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>-->
				<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
		<!-- 错误日志-->
		<RollingFile name="ROLLING_ERROR" fileName="${LOG_HOME}/${SERVER_ERROR_NAME}.log" filePattern="${LOG_HOME}/${SERVER_ERROR_NAME}_%d{yyyy-MM-dd}_%i.log">
			<PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
				<SizeBasedTriggeringPolicy size="51200 KB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
			<Filters>
				<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
	</appenders>
	<loggers>
		<!-- show sql-->
		<logger name="com.migu.cdps.dao" level="DEBUG"/>
		<root level="DEBUG">
			<appender-ref ref="CONSOLE" />
			<appender-ref ref="CATALINA_BASE_ROLLING" />
			<appender-ref ref="ROLLING"/>
			<appender-ref ref="ROLLING_ERROR"/>
		</root>
	</loggers>
</configuration>

 

新增RollingFile

<!-- catalina.out -->
		<RollingFile name="CATALINA_BASE_ROLLING" fileName="${CATALINA_BASE}/catalina.out" filePattern="${CATALINA_BASE}/catalina_%d{yyyy-MM-dd}_%i.log">
			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
				<SizeBasedTriggeringPolicy size="102400 KB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
		</RollingFile>

其实我个人理解,这个应该是覆盖了catalina.out的输出,不知道理解是否正确。

 

下面讲解下几个配置项

1、TimeBasedTriggeringPolicy

基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:

interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟

modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00,。。。

2、SizeBasedTriggeringPolicy

控制文件大小,当大于设置大小时,文件会按照filePattern的格式去进行分割

3、DefaultRolloverStrategy

生成分割文件的个数,默认为7

4、Filters

主要是做日志过滤的,

比如只想在某个日志文件中展示info以上级别的日志

<Filters>
    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

如果想在该日志中只展示info不展示error级别日志

<Filters>
    <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

5、最后来说下PatternLayout

(1)pattern属性具体描述,详细的可到官网进行查看《log4j-users-guide.pdf》

参数名

参数意义

详细描述

%c{参数}或%logger{参数}

输出logger的名称,即语句private static final Logger logger = LogManager.getLogger(App.class.getName())中App.class.getName()的值。也可以使用其他字符串。

如果不带参数,则输出完整的logger名称;如果参数是整数n(只支持正整数),则先将logger名称依照小数点(.)分割成n段,然后取右侧的n段;如果参数不是整数,则除了最右侧的一段,其他整段字符都用这个字符代替,保留小数点;不管怎么写,最右侧的一段都保持不变。默认不带参数,并输出logger的完整名称。注意:上面的说明写得很烂,但是官方文档写得就这么烂,而且还不完整,看不懂是必然的,还请看官自己多试验,才能有所领会。如果看官自己懒得试验又看不懂,只能建议不要加参数,直接%c输出完整值。

示例:

pattern表达式

logger名称

结果

%c{1}

org.apache.com.te.Foo

Foo

%c{2}

org.apache.com.te.Foo

te.Foo

%c{1.}

org.apache.com.te.Foo

o.a.c.t.Foo

%c{1.1.!}

org.apache.com.te.Foo

o.a.!.!.Foo

%c{.}

org.apache.com.te.Foo

….Foo

%C{参数}或%class{参数}

输出类名。注意,这个是大写C,上面是小写c

参数规则与%c完全一样,请参见上面的说明。

%d{参数}{时区te{参数}{时区

输出时间。

第一个大括号数可以是保留关键字,也可以是text.SimpleDateFormat字符拼接而成。保留关键字有:DEFAULT,ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。

第二个大括号中的参数是java.util.TimeZone.getTimeZone的值,可以设定时区。

示例:

pattern表达式

输出

%d{DEFAULT}

2012-11-02 14:34:02,781

%d{ISO8601}

2012-11-02T14:34:02,781

%d{ISO8601_BASIC}

20121102T143402,781

%d{ABSOLUTE}

14:34:02,781

%d{DATE}

02 Nov 2012

14:34:02,781

%d{COMPACT}

20121102143402781

%d{HH:mm:ss,SSS}

14:34:02,781

%d{dd MMM yyyy HH:mm:ss,SSS}

02 Nov 2012

14:34:02,781

%d{HH:mm:ss}{GMT+0}

18:34:02

%d{UNIX}

1351866842

%d{UNIX_MILLIS}

1351866842781

输出特殊字符

&, <, >, ”, ’全都要使用实体名称或实体编号替代,即

符号

实体名称

实体编号

&

&amp;

&#38;

&lt;

&#60;

&gt;

&#62;

&quot;

&#34;

&apos;

&#39;

官方文档说pattern删除了\r和\n,但是经我测试可以使用,明显是官方文档的错误。

%F|%file

输出文件名

仅仅是文件名称,如Test.java,不包含路径名称

highlight{pattern}{style}

高亮显示结果

 

%l

输出完整的错误位置,如com.future.ourfuture.test.test.App.tt(App.java:13)

注意1:这个是小写的L。

注意2:使用该参数会影影响日志输出的性能。

%L

输出错误行号,如“13”

注意:使用该参数会影响日志输出的性能。

%m或%msg或%message

输出错误信息,即logger.error(String msg)中的msg

 

%M或%method

输出方法名,如“main”,“getMsg”等字符串

 

%n

换行符

根据系统自行决定,如Windows是”\r\n”,Linux是”\n”

%level{参数1}{参数2}{参数3}

参数1用来替换日志信息的级别,格式为:{level=label, level=label, …},即使用label代替的字符串替换level。其中level为日志的级别,如WARN/DEBUG/ERROR/TRACE/INFO

参数2表示只保留前n个字符。格式为length=n,n为整型。但参数1中指定了label的字符串不受此参数限制

参数3表示结果是大写还是小写。参数1指定了label的字符串不受此参数限制。

示例:

输入

输出

%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I}

logger.warn输出W, logger.debug输出D,其他依次类推

%level{ERROR=FSF, length=2, lowerCase=true}

logger.error会输出FSF,其他均只输出前两个字母,且小写,如wa/de/in/tr

%level{length=3}

所有都只输出前3个字符,如WAR/DEB /ERR/TRA/INF

%r或%relative

输出自JVM启动以来到log事件开始时的毫秒数

 

replace{pattern}{regex}{substitution}

将pattern的输出结果,按照正则表达式regex匹配后,使用substitution字符串替换

例如:"%replace{%logger }{\.}{/}就是将所有%logger中的小数点(.)全部替换为斜杠,如果%logger是com.future.ourfuture.test.test.App则输出为com/future/ourfuture/test/test/App。pattern中可以写多个表达式,如%replace{%logger%msg%C}{\.}{/}%n

%sn或%sequenceNumber

自增序号,每执行一次log事件,序号+1,是一个static变量。

 

%t或%thread

创建logging事件的线程名

 

%u{RANDOM|TIME}或%uuid{RANDOM|TIME}

依照一个随机数或当前机器的MAC和时间戳来随机生成一个UUID

 

(2)pattern的对齐修饰

对齐修饰,可以指定信息的输出格式,如是否左对齐,是否留空格等。

编写格式为在任何pattern和%之间加入一个小数,可以是正数,也可以是负数。如%10.20c表示对logger的信息进行处理。%-10.20m表示对message进行处理。

整数表示右对齐,负数表示左对齐;整数位表示输出信息的最小10个字符,如果输出信息不够10个字符,将用空格补齐;小数位表示输出信息的最大字符数,如果超过20个字符,则只保留最后20个字符的信息(注意:保留的是后20个字符,而不是前20个字符)。

下面是一些示例。

 

格式

是否左对齐

最小宽度

最大宽度

说明

%20

右对齐

20

右对齐,不足20个字符则在信息前面用空格补足,超过20个字符则保留原信息

%-20

左对齐

20

左对齐,不足20个字符则在信息后面用空格补足,超过20个字符则保留原信息

%.30

不对齐

30

如果信息超过30个字符,则只保留最后30个字符

%20.30

右对齐

20

30

右对齐,不足20个字符则在信息前面用空格补足,超过30个字符则只保留最后30个字符

%-20.30

左对齐

20

30

左对齐,不足20个字符则在信息后面用空格补足,超过30个字符则只保留最后30个字符

 

以上Pattern说明摘自http://www.aiuxian.com/article/p-2039402.html

我在测试的时候发现@msg不管用,改为@m可在catalina.out中展示信息

#配置tomcat的日志输出方式,这里表示文件输出和控制台输出
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
catalina.org.apache.juli.FileHandler.level = FINE #日志级别
例:
1catalina.org.apache.juli.FileHandler.level = FINE #设置 catalina 日志的级别为: FINE
1catalina.org.apache.juli.FileHandler.level = OFF #禁用 catalina 日志的输出
1catalina.org.apache.juli.FileHandler.level = ALL#输出 catalina 所有的日志消息均输出

catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs #日志输出目录,此设置表示tomcat日志输出到tomcat\logs目录下

catalina.org.apache.juli.FileHandler.prefix = catalina. #日志输出前缀,后面跟日期信息(yyyy-MM-dd) 
注:tomcat_6.0.29输出4种不同的日志:catalina、localhost、manager、host-manager

java.util.logging.ConsoleHandler.level = FINE #控制台日志输出级别
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter #控制台日志输出格式化类,Formatter 为格式化 LogRecords 提供支持。

下面是每个日志文件的输出级别和处理类
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler
解决catalina.out 过大的问题:
1.修改配置文件,控制输出到catalina.out 中的级别(log4j.1.* 与log4j.2.* 均可以设置输出级别,catalina.out 试过很多次,但不能切割,其他文件可以按照时间日期打包存储)
2.通过脚本插件分割
https://my.oschina.net/liuhuan0927/blog/609144?p=

Cronolog是一款日志轮循(rotation)工具,可以用它来把Apache、Tomcat等Web服务器上输出的日志切分成按日或月保存的文件。

Cronolog从标准输入中读取日志内容,然后把它们写到按指定格式命名的日志文件中。日志文件的名称可以加入一段日期标记(如Catalina.2009-06-07.out),当日期改变后Cronolog会把之前的日志文件关闭,再打开一个包含新日期的日志文件(如Catalina.2009-06-08.out)。

利用Cronolog可以完美解决tomcat中的catalina.out日志文件不断增大,且不能在tomcat运行期间删除的问题。

需要注意的一个问题是,日期改变后cronolog并不是马上切换日志文件,而是需要有新的日志输出才能触发cronolog切换日志文件。所以如果你想在2009-06-08删除2009-06-07的日志文件,如果从2009-06-08的00:00开始到你执行删除时都没有日志输出,则2009-06-07的日志文件可能仍然被占用着,导致删除失败。

(1)首先安装cronolog

yum install cronolog -y

(2)修改Tomcat配置文件

先停止tomcat服务,然后修改以下文件:

%CATALINA_HOME%/bin/catalina.sh

org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

替换为:

org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
| /usr/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &

修改完毕后重新启动tomcat服务


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值