日志设置¶
项目
Resin可以指定JDK日志记录接口的输出目的地,并重定向Web应用程序的标准输出和标准错误输出。
java.util.logging¶
总览¶
Resin对所有内部日志使用JDK标准java.util.logging,并提供灵活的日志格式和日志级别配置。
日志配置分为两部分:日志处理程序和记录器级别。
日志处理程序告诉将树脂日志输出到何处。 Resin包括基于文件的日志处理程序,邮件处理程序,syslog处理程序以及符合JDK标准的任何自定义日志处理程序。
基于文件的日志处理程序示例
<日志处理程序 名称=“ com.foo” 等级=“全部”
路径=“ $ {resin.root} /log/foo.log”
时间戳=“ [[%y-%m-%d%H:%M:%S.%s] {%{thread}}”/>
<logger>设置命名记录器的记录级别。 <logger>通常具有多个日志处理程序,因此记录程序级别和日志处理程序级别的输出必须匹配。
因为记录器和日志处理程序名称是分层的,所以“ com.foo” <logger>启用“ com.foo.bar”。
“精细”级别日志输出设置的示例
<记录器 名称=“ com.foo” 等级=“好”/>
<记录器 名称=“ com.foo.bar” 等级=“最好”/>
日志名称¶
JDK日志记录API使用分层命名方案。通常,该名称与Java类名称相同。如果指定了名称,则名称以指定名称开头的所有日志记录请求都将被匹配。
例如,<logger name =” example.hogwarts” ...>匹配“ example.hogwarts.System”和“ example.hogwarts.gryffindor.System”的日志记录请求。
Resin自己的日志记录基于Resin类名称。以下是树脂的有用日志名称的一览表 。
名称 | 意义 |
---|---|
“” | 调试一切。 |
com.caucho.ejb | EJB处理。 |
com.caucho.jsp | JSP调试。 |
com.caucho.java | Java编译。 |
com.caucho.server.port | TCP端口调试和Thread。 |
com.caucho.server.http | HTTP相关的调试。 |
com.caucho.server.webapp | Web应用程序相关的调试。 |
com.caucho.server.cache | 缓存相关的调试。 |
com.caucho.sql | 数据库池。 |
交易交易 | 事务处理。 |
日志级别¶
记录器级别启用给定调试粒度的记录。 “严重”级别显示威胁服务器稳定性的日志,“精细”级别显示应用程序/库用户的调试信息。
日志记录级别与JDK java.util.logging.Level中定义的值匹配。
名称 | API | 用途 |
---|---|---|
关 | 关闭日志记录。 | |
严重的 | log.severe(“ ...”) | 妨碍程序执行的故障,例如无法启动Web应用程序或服务器重新启动 |
警告 | log.warning(“ ...”) | 严重的问题,可能会向浏览器返回响应代码500。 |
资讯 | log.info(“ ...”) | 关键生命周期事件,例如启动Web应用程序。 |
配置 | log.config(“ ...”) | 设置的详细内容日志。 |
很好 | log.fine(“ ...”) | 针对不熟悉源代码的开发人员的用户级调试。 |
更好 | log.finer(“ ...”) | 开发人员使用的详细内容调试。 |
最好的 | log.finest(“ ...”) | 通过详细内容跟踪进行调试。 |
全部 | 所有消息均已记录。 |
<日志处理程序>¶
为JDK java.util.logging * API设置日志处理程序。
java.util.logging有两个步骤。设置一组日志处理程序和每个记录器级别的设置。 <log-handler>创建日志目标,为处理程序设置最低日志级别,并将处理程序附加到日志名称。
配置自定义处理程序的<log-handler>具有最常见的设置,即旋转日志文件。大多数设置用于轮换日志,并与其他日志设置共享。
日志处理程序时间戳¶
日志标记的时间戳是一个字符串,其格式可以包括用日期和时间值替换的“%”代码。
代号 | 意义 |
---|---|
%a | 星期几(略) |
%A | 星期几( 详细内容 ) |
%b | 月(略) |
%B | 月( 详细内容 ) |
%c | Java语言环境日期 |
%d | 月(两位数) |
%H | 24小时(两位数) |
我 | 12小时(两位数) |
%j | 一年中的天数 |
%米 | 月(两位数) |
%M | 分钟 |
%p | 上午/下午 |
%S | 第二个 |
%秒 | 毫秒 |
%W | 年的周数(3位数字) |
%w | 天数几(1位数字) |
%y | 年(两位数) |
%Y | 年份(4位) |
%Z | 时区(名称) |
%z | 时区(+/- 0800) |
%{thread} | 当前Thread的名称 |
%{level} | 当前日志级别 |
%{env} | 当前的类加载器环境 |
典型的日志标签时间戳的示例
<日志处理程序 名称='' 路径='stderr:' 时间戳=“ [[%H:%M:%S.%s] {%{thread}}”/>
[22:50:11.648] WebApp [/ doc]开始[22:50:11.698] http收听*:8080 [22:50:11.828] hmux收听*:6800
日志处理程序存档¶
下面的示例是一个标准日志处理程序,它写入过渡文件。由于处理程序级别为“全部”,因此<logger>设置实际的日志级别。
<日志处理程序 名称=” 等级=“全部”
时间戳=“ [[%Y /%m /%d%H:%M:%S.%s] {%{thread}}”/>
<记录器 名称=“ com.caucho” 等级=“信息”/>
默认存档格式如下。
-
过渡期超过1天(1D)。
路径+“。%Y%m%d”
-
过渡期少于1天(1D)。
路径+“。%Y%m%d。%H”
例如,以下是设置所有使用标准错误输出的日志的示例。
<日志处理程序 名称='' 等级=“全部” 路径='stderr:' 时间戳=“ [%H:%M:%S.%s]”/>
一种有用的技术是打开所有调试日志输出以跟踪问题。
<日志处理程序 名称='' 等级=“更细” 路径='日志/debug.log'
时间戳=“ [%H:%M:%S.%s]”
展期='1h' 累计数='1'/>
日志处理程序EL格式¶
在Resin的<log-handler>的format属性中指定每个日志消息的格式字符串。该格式可以识别EL表达式。
格式字符串示例
<日志处理程序 名称='' 等级=“全部” 路径='stderr:' 时间戳=“ [%H:%M:%S.%s]”
格式=“ $ {log.level} $ {log.name} $ {log.message}”/>
记录EL变量
可变的 | 说明 |
---|---|
$ {log.level} | 日志级别。 |
$ {log.name} | 记录器名称。 |
$ {log.shortName} | 简短的记录器名称(“ Foo”而不是“ com.hogwarts.Foo”) |
$ {log.message} | 日志消息。 |
$ {log.millis} | 事件发生的时间。自1970年以来的毫秒数。 |
$ {log.sourceClassName} | 请求记录的类的名称。 (在运行时可能不可用。) |
$ {log.sourceMethodName} | 请求记录的方法的名称。 (在运行时可能不可用。) |
$ {log.threadID} | 获取发起日志记录请求的Thread的int类型标识符。 |
$ {log.thrown} | 获取与日志记录请求关联的java.lang.Throwable。 |
$ {thread} | 当前Thread的名称。 |
$ {request} | Servlet请求值。 |
$ {session} | HTTP Session 。 |
$ {cookie ['JSESSIONID']} | 要求Cookie值。 |
您也可以在格式字符串中使用环境EL变量。
<web-app> <log name = '' level = ' all'path = 'log / debug.log'timestamp = “ [%H:%M:%S.%s]” format = “ [$ {app。 contextPath}] $ {log.message}“ /> ... </ web-app>
[14:55:10.189] [/ foo]`null'返回JNDI java:EnvironmentClassLoader的模型[web-app:http://本地主机:8080 / foo] [14:55:10.189] [/ foo] JNDI查找` java:comp / env / caucho / auth'exception javax.naming.NameNotFoundException:java:comp / env / caucho / auth [14:55:10.199] [/ foo]应用程序[http://本地主机:8080 / foo]开始
记录器:应用程序记录¶
要在应用程序中执行日志记录,可以使用JDK的日志记录功能。正确的日志名称和级别对于疑难解答和调试代码很重要。过多的日志记录对开发人员来说就像减少日志记录一样令人困惑。
日志名称应该是实现类的完整类名。可以使用其他名称,但是使用类名称可以提高可维护性。
日志级别应在整个应用程序中保持一致。树脂使用以下级别的表示法:
更好的日志记录示例
进口 java.util.logging.Logger;
进口 java.util.logging.Level;
公开的 类 oo {
私人的 静态的 最后的 记录仪 日志
= 记录仪。getLogger(oo。类。getName());
...
虚空 doFoo(弦乐 吧)
{
//检查日志级别(如果您的日志记录调用还有其他功能)
//比传递参数
如果 (日志。isLoggable(等级。罚款))
日志。更好(这个 + “ doFoo(” + 吧 + “)”);
...
日志。资讯(...);
试一试 {
...
} 赶上 (ExpectedException 前) {
日志。日志(等级。最好的, “预期的异常”, 前);
}
}
...
}
自定义和库日志处理程序¶
可以使用CanDI XML语法配置自定义处理程序和库日志处理程序。
JDK FileHandler示例
<web-app xmlns = “ http://caucho.com/ns/resin” xmlns:jdk-logging = “ urn:java.util.logging” > <log-handler name = “ com.foo” level = “信息“ > <jdk-logging:FileHandler> <新> <value> /tmp/test.out </ value> </ new> </ jdk-logging:FileHandler> </ logger> </ web-app>
包装 com.foo.demo;
进口 java.util.logging。*;
公开的 类 我的处理程序 延伸 处理程序
{
@Override
公开的 虚空 发表(日志记录 记录)
{
系统名称。出。打印(getFormatter()。格式(记录));
}
@Override
公开的 虚空 齐平();
{
}
@Override
公开的 虚空 关闭();
{
}
}
自定义日志格式¶
与日志处理程序一样,您可以自定义日志消息的格式。可以通过Resin知道java.util.logging接口并使用<log-handler>来配置格式化程序。
您可能需要更改日志消息的格式,以更好地收集站点信息。格式化程序也可以像处理程序一样进行自定义。
自定义格式的设置示例
<日志处理程序 名称=“ com.foo” 等级=“警告” 路径=“ WEB-INF / log.log”>
<formatter> <mypkg:MyFormatter /> </ formatter>
</ log-handler>
MyFormatter.java
包装 com.mycom.mypkg;
进口 java.util.logging。*;
公开的 类 MyFormatter 延伸 格式化程序
{
@Override
公开的 弦乐 格式(日志记录 记录)
{
归还 “ [” + 记录。getLevel() + “]” + 记录。getMessage();
}
}
树脂内置日志处理程序¶
Resin带有一个自定义日志处理程序,该处理程序将具有常见日志格式的消息发送到JMS,HMTP和syslog服务。
创建自定义处理程序也很容易。
BamLogHandler¶
BAM处理程序将日志消息发布到BAM代理。代理可以具有自定义的HMTP服务来处理日志消息。 BamHandler要求使用JID(Jabber ID)作为目标服务的地址。
BAM处理程序配置示例
<logger name = “ com.foo” > <resin:BamLogHandler level = “警告” > <to>测试@本地主机</ to> </ resin:BamLogHandler> </ logger>
EventLogHandler¶
事件处理器向CanDI事件系统发出LogEvent。 LogEvent接收通知,因此任何具有@Observes方法的CanDI组件都将接收该通知。日志处理程序的类名称为com.caucho.log.EventLogHandler。
事件处理器设置示例
<记录器 名称=“ com.foo”>
<resin:EventLogHandler 等级=“警告”/>
</ logger>
JmsLogHandler¶
JMS处理程序将日志消息发布到JMS队列。
JMS处理程序配置示例
<web-app xmlns = “ http://caucho.com/ns/resin” xmlns:ee = “ urn:java:ee” xmlns:resin = “ urn:java:com.caucho.resin” > <resin:MemoryQueue ee:命名= “ myQueue” /> <logger 名称= “ com.foo” > <resin:JmsLogHandler 级别= “ warning” > <target> $ {myQueue} </ target> </ resin:JmsLogHandler> </ logger> </ web-app>
MailLogHandler¶
电子邮件处理程序将日志消息发送到电子邮件地址。为了减少电子邮件的数量,处理程序将邮件串联起来,并在一定时间后发送。
MailLogHandler属性
属性名称 | 说明 | 默认 |
---|---|---|
到 | 电邮地址 | 无(必填) |
延迟时间 | 发送第一封电子邮件之前需要等待的时间 | 1m(1分钟) |
邮件间隔分钟 | 电子邮件之间的最小间隔 | 1小时(1小时) |
属性 | JavaMail属性 | 无 |
邮件处理程序设置示例
<logger name = “” > <resin:MailLogHandler 级别= “ warning” > <to> admin@foo.com </ to> <properties> mail.smtp.host = 127.0.0.1 mail.smtp.port = 25 </属性> </树脂:MailLogHandler> </记录器>
SyslogHandler¶
在UNIX系统上,可以使用SyslogHandler将消息记录到syslog。
SyslogHandler配置示例
<记录器 名称= “” > <树脂:SyslogLogHandler 级别= “警告” > <facility>守护程序</设施> <severity>通知</严重性> </ resin:SyslogLogHandler> </ logger>
工具的可能值是:user,mail,daemon,auth,lpr,news,uucp,cron,authpriv,ftp,local0,local1,local2,local3,local4,local5,local6,local7。 默认值为守护程序。
紧急程度,紧急程度,严重程度,错误,警告,通知,信息和调试可用于严重性。
请参见“ man 3 syslog”和“ man syslog.conf”。
日志旋转和归档¶
日志轮换每周或每天存档日志文件。发生过渡时,将更改现有日志文件的名称,并将日志输出到新的日志文件。
树脂日志轮换用于JDK日志记录,HTTP访问日志和标准输入/输出日志。
按大小滚动¶
当文件大小达到一定数量时,将发生翻转。 Resin的默认行为是在文件大小达到1MB时翻转。
“滚动大小”用于指定最大大小,并且可以指定字节(50000),千字节(128kb)和兆字节(10mb)。 -1禁用按大小滚动。
按时间滚动¶
自上次翻转以来的一段时间后已翻转。 Resin的默认行为是不执行基于时间的翻转,除非将“ rollover-size”设置为-1并且禁用了“按尺寸翻转”。如果禁用大小翻转,则默认期限为一个月。
“周转期”用于指定时间段,可以指定为日(15D),周(2W),月(1M)或时间(1h)。
标准输出重定向¶
标准输出日志¶
设置System.out的目标。
标准输出日志中的设置优先于父级中的设置。例如,如果您将标准输出日志指定为<web-app>的子级,则将执行在Web应用程序中执行的System.out重定向,并且将优先于父级<主机>的标准输出日志的设置。
注意
“路径”不得与在命令行“ -stdout”上指定的路径相同。如果指定相同的路径,则这些进程将争夺文件所有权。
属性¶
属性名称 | 说明 | 默认 |
---|---|---|
档案格式 | 过渡存档文件名的格式 | 见下文 |
路径 | 目标路径 | 无(必填) |
路径格式 | 指定用于确定路径的格式。语法与“存档格式”相同。 | 无(可选) |
滚动数 | 过渡文件的最大数量。 | 无 |
展期 | 多久滚动一次。日期(15D),星期(2W),月份(1M),时间(1H)。 | 无 |
滚动大小 | 要翻转的文件的最大大小。字节(50000),KB(128kb),兆字节(10mb)。 | 1兆字节(1mb) |
时间戳记 | 行首使用的时间戳格式。 | 没有时间戳记 |
默认存档格式如下。
-
过渡期超过1天(1D)。
路径+“。%Y%m%d”
-
过渡期少于1天(1D)。
路径+“。%Y%m%d。%H”
以下示例在<host>上配置System.out。主机中的所有Web应用程序都将写入相同的输出文件,除非<web-app>中的输出日志设置被覆盖。
<host id = 'foo.com' > <stdout-log path = '/var /log / foo / stdout.log'rollover-period = '1W' /> ... </ host>
标准日志¶
设置System.err的目标。
stderr日志中的设置优先于父级中的设置。例如,如果将stderr日志指定为<web-app>的子级,则将执行Web应用程序中执行的System.err重定向,并且其优先级高于父<host>的stderr日志的设置。
注意
“路径”不得与在命令行“ -stderr”上指定的路径相同。如果指定相同的路径,则这些进程将争夺文件所有权。
属性¶
属性名称 | 说明 | 默认 |
---|---|---|
档案格式 | 过渡存档文件名的格式 | 见下文 |
路径 | 目标路径 | 无(必填) |
路径格式 | 指定用于确定路径的格式。语法与“存档格式”相同。 | 无(可选) |
滚动数 | 过渡文件的最大数量。 | 无 |
展期 | 多久滚动一次。日期(15D),星期(2W),月份(1M),时间(1H)。 | 无 |
滚动大小 | 要翻转的文件的最大大小。字节(50000),KB(128kb),兆字节(10mb)。 | 1兆字节(1mb) |
时间戳记 | 行首使用的时间戳格式。 | 没有时间戳记 |
默认存档格式如下。
-
过渡期超过1天(1D)。
路径+“。%Y%m%d”
-
过渡期少于1天(1D)。
路径+“。%Y%m%d。%H”
以下示例在<host>上配置System.out。主机中的所有Web应用程序都将写入相同的输出文件,除非<web-app>中的输出日志设置被覆盖。
<host id = 'foo.com' > <stderr-log path = '/var /log / foo / stderr.log'rollover-period = '1W' /> ... </ host>
<访问日志>¶
<access-log>配置访问日志文件。
如果在<web-app>的子级中定义,则将覆盖<host>定义。如果在<host>的子项中定义,则将覆盖<server>的定义。
默认存档格式如下。
-
过渡期超过1天(1D)。
路径+“。%Y%m%d”
-
过渡期少于1天(1D)。
路径+“。%Y%m%d。%H”
在访问日志中,跟随Apache变量获取格式变量。
格式类型¶
模式 | 说明 |
---|---|
%b | 要返回的内容的长度。 |
%D | 处理请求所花费的时间。 (微秒) |
%h | 远端IP地址。 |
%{xxx}我 | 请求标头。 |
%{xxx} o | 响应头。 |
%{xxx} c | Cookie值。 |
%n | 请求属性值。 |
%r | 请求网址。 |
%秒 | 状态码。 |
%S | Session ID。 |
%{xxx} t | 日期和时间格式。 |
%T | 处理请求所花费的时间。 (第二) |
%u | 远程用户。 |
铀 | 请求URI 。 |
%v | 虚拟主机的服务器名称。 |
默认格式如下。
“%h%l%u%t \ ”%r \ “%> s%b \ ”%{Referer} i \ “ \ ”%{User-Agent} i \ “
属性¶
属性名称 | 说明 | 默认 |
---|---|---|
路径 | 目标路径 | 无(必填) |
路径格式 | 指定用于确定路径的格式。语法与“存档格式”相同。 | 无(可选) |
档案格式 | 过渡存档文件名的格式。 | 见下文 |
自动冲洗 | 如果为True,则在每次请求时刷新内存缓冲区。 | false |
自动冲洗时间 | 刷新内存缓冲区的时间间隔。 | 60秒(60秒) |
排除 | 如果请求URI匹配,则不会将其记录在访问日志中。 | 无(可选) |
格式 | 访问日志格式。 | 见上文。 |
主机名-DNS查找 | 记录DNS名称而不是IP地址。 (这可能会影响性能。) | false |
展期 | 多久滚动一次。按天(15D),周(2W),月(1M)或小时(1h)指定。 | 无(可选) |
滚动大小 | 要滚动的日志文件的最大大小。以字节(50000),千字节(128kb)或兆字节(10mb)为单位指定。 | 1 GB(1 GB) |
滚动数 | 过渡文件的最大数量。 | 无 |
在<host>中设置<access-log>的示例。
<群集 ID = “应用程序层” > <主机 ID = “” > <访问日志 路径= '日志/ access.log' > <翻转时间> 2W </翻转时间> </访问日志> < / host> </ cluster>