ali*_*mon 5 java logging log4j apache-chainsaw
我正在尝试将日志记录组件添加到分布式系统.它是AspectJ为了避免链接当前的源代码而编写的.我使用socket appender发送日志,但我想尝试一些更有效的方法.
我听说过,我应该用JMSAppender和AsyncAppender,但是我忘了配置.我应该创建Receiver哪些收集日志并将它们传递给数据库和GUI(我使用ChainSaw)?
我试着关注turorial1和tutorial2,但是他们还不够清楚.

编辑:
在我准备的小型演示中,我发送了6个日志以请求(模拟3个组件)
[2012-08-08 15:40:28,957] [request1344433228957] [Component_A] [start]
[2012-08-08 15:40:32,050] [request1344433228957] [Component_B] [start]
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [start]
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [end - throwing]
[2012-08-08 15:40:32,144] [request1344433228957] [Component_B] [end]
[2012-08-08 15:40:32,175] [request1344433228957] [Component_A] [end]
Run Code Online (Sandbox Code Playgroud)
使用套接字Appender.所以我的log4j.properties是:
log4j.rootLogger=DEBUG, server
log4j.appender.server=org.apache.log4j.net.SocketAppender
log4j.appender.server.Port=4712
log4j.appender.server.RemoteHost=localhost
log4j.appender.server.ReconnectionDelay=1000
Run Code Online (Sandbox Code Playgroud)
所以我跑了
>java -classpath log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties
Run Code Online (Sandbox Code Playgroud)
配置
log4j.rootLogger=DEBUG, CA, FA
#
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n
#
log4j.appender.FA=org.apache.log4j.FileAppender
log4j.appender.FA.File=report.log
log4j.appender.FA.layout=org.apache.log4j.PatternLayout
log4j.appender.FA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n
Run Code Online (Sandbox Code Playgroud)
然后我将我的日志从文件发送到Chainsaw:

这绝对是基本的,但我想学习如何做得更好.首先,我想异步发送日志.然后创建非常简单的Receiver,例如可以将日志传递给文件.
我试着按照上面列出的教程,但是我失败了.所以问题是:你能提供一些示例配置吗?示例Receiver.java和log4.properties文件?
最后我找到了如何配置它。我将 2 个文件放入src文件夹中。
jndi.属性
topic.logTopic=logTopic
Run Code Online (Sandbox Code Playgroud)
和 log4j-jms.properties
log4j.rootLogger=INFO, stdout, jms
## Be sure that ActiveMQ messages are not logged to 'jms' appender
log4j.logger.org.apache.activemq=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=
## Configure 'jms' appender. You'll also need jndi.properties file in order to make it work
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory
log4j.appender.jms.ProviderURL=tcp://localhost:61616
log4j.appender.jms.TopicBindingName=logTopic
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
Run Code Online (Sandbox Code Playgroud)
然后我用 VM 参数运行我的程序
-Dlog4j.configuration=log4j-jms.properties
Run Code Online (Sandbox Code Playgroud)
并在课堂上接收日志Receiver.java
public class Receiver implements MessageListener {
PrintWriter pw = new PrintWriter("result.log");
Connection conn;
Session sess;
MessageConsumer consumer;
public Receiver() throws Exception {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection conn = factory.createConnection();
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
MessageConsumer consumer = sess.createConsumer(sess.createTopic("logTopic"));
consumer.setMessageListener(this);
}
public static void main(String[] args) throws Exception {
new Receiver();
}
public void onMessage(Message message) {
try {
LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message).getObject();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
String nowAsString = df.format(new Date(event.getTimeStamp()));
pw.println("["+ nowAsString + "]" +
" [" + event.getThreadName()+"]" +
" ["+ event.getLoggerName() + "]" +
" ["+ event.getMessage()+"]");
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1600 次 |
| 最近记录: |