单位有很多java项目,一般上生产的项目日志都是通过log4j打印在本地,平常开发同学要查看日志还要给他们开个专门的FTP,不利于集中维护管理,近日因工作需要,在网上看到相关技术资料,可把log4j日志直接存放到mongoDB,在mongoDB的可以更好的查询日志。非常利于集中管理和维护。以下是自己和开发同学配置部署的过程,可谓是一波三折:
Log4mongo for Java官方介绍:
- MongoDbAppender - stores the LogEvent in a BSONified form
- ExtendedMongoDbAppender - Extends MongoDbAppender by allowing you to add top level elements
- MongoDbPatternLayoutAppender - supports logging data in a custom format
1.首先下载并安装mongoDB,并运行 ,下载安装请参考我的
版本要求(MongoDB Server v2.0+ (tested with 2.2.2))2.下载 jar包
3.下载 jar包 注意版本,一定要1.2.16及以上。
4.下载 jar包
5.请将这三个jar文件放置在你的项目classpath中。
6.在你的classpath中创建一个名为log4j.properties的文件
7.在log4j.properties文件尾添加以下几行
log4j.rootLogger=INFO, MongoDB log4j.appender.MongoDB=org.log4mongo.MongoDbAppender log4j.appender.MongoDB.databaseName=appname log4j.appender.MongoDB.collectionName=log
如果你的mongoDB不是在本地,那添加mongoDB数据库的IP地址和端口
log4j.appender.MongoDB.hostname=172.17.0.9 log4j.appender.MongoDB.port=27017
创建一个Java类,如:
import org.apache.log4j.Logger;public class LogTest { public static void main(String[] args) { Logger logger = Logger.getLogger(LogTest.class); logger.error("Don't panic"); }}
编译和运行这个类
碰到问题,mongoDB里的日志数据始终不见出来。后来发现问题,原因是项目要部署到tomcat上才可能生效。
以下是开发同学整理的部署情况
1、建立一个web项目,项目名为logmongo,在项目当中引入jar包,见步骤2~4(指你写的)描述,共3个jar包。2、log4j.properties内容:log4j.rootLogger=debug, stdout, R, MongoDBlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%-d{MM-dd HH:mm:ss.SSS} %-5p - [%c{1}.%t] %m%nlog4j.appender.R=org.apache.log4j.RollingFileAppenderlog4j.appender.R.File=logs/client.loglog4j.appender.R.MaxFileSize=1000KBlog4j.appender.R.MaxBackupIndex=1log4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%-d{MM-dd HH:mm:ss.SSS} %-5p - [%c{1}.%t] %m%nlog4j.appender.MongoDB=org.log4mongo.MongoDbAppenderlog4j.appender.MongoDB.databaseName=appnamelog4j.appender.MongoDB.collectionName=loglog4j.appender.MongoDB.hostname=172.17.0.9log4j.appender.MongoDB.port=270173、web.xml内容4、log4jServlet.javaimport java.io.IOException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;public class log4jServlet extends HttpServlet { private static Logger logger = Logger.getLogger(log4jServlet.class); public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this.doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { logger.error("test for tomcat"); }}5、部署到tomcat上运行,浏览器中输入http://localhost:8080/logmongo/log4jServlet即可。 index.jsp log4jConfigLocation classpath:/log4j.properties log4jServlet log4jServlet log4jServlet /log4jServlet
然后查看mongoDB,看是否有记录
[root@zabbix bin]# ./mongoMongoDB shell version: 2.2.2connecting to: test> show dbsadmin (empty)appname 0.203125GBlocal (empty)> use appnameswitched to db appname> db.log.findOne(){ "_id" : ObjectId("513427c2abef7a8b93610a70"), "timestamp" : ISODate("2013-03-04T04:49:06.060Z"), "level" : "ERROR", "thread" : "http-8080-1", "message" : "Don't panic", "loggerName" : { "fullyQualifiedClassName" : "log4jServlet", "package" : [ "log4jServlet" ], "className" : "log4jServlet" }, "fileName" : "log4jServlet.java", "method" : "doGet", "lineNumber" : "24", "class" : { "fullyQualifiedClassName" : "log4jServlet", "package" : [ "log4jServlet" ], "className" : "log4jServlet" }, "host" : { "process" : "6752@yangyang", "name" : "yangyang", "ip" : "10.1.19.2" }}
接下去,可以用PHP写个查看mongoDB数据的程序,友好的把日志通过网页形式显示出来。
MongoDB的PHP扩展安装
1.下载php扩展包:
tar zxvf mongo-1.3.4.tgzcd mongo-1.3.4/#/usr/local/webserver/php/ 您的php实际安装目录 /usr/local/webserver/php/bin/phpize./configure --with-php-config=/usr/local/webserver/php/bin/php-configmake && make install
php读取mongodb日志数据程序如下
appname; $collection = $db->log;?>log4j for mongodb
ID | TIMESTAMP | LEVEL | THREAD | MESSAGE | LOGGERNAME | FILENAME | METHOD | lineNumber | CLASS | HOST | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
fullyQualifiedClassName | package | className | fullyQualifiedClassName | package | className | process | name | ip | ||||||||
运行效果如图:
另:log4j还可以通过配置写到MySQL数据库里去。不过论现在形式而言,存到nosql里去会更优雅.