我是一个新入行的菜鸟,现在在做java服务器,在这里记录下服务器框架的主要构成,有任何不准确与错误的地方,希望看到的人提出意见。非常感谢!
一、概述。
1.1日志系统介绍。
任何一个应用程序或者游戏的服务器日志系统都是必须的,日志系统的主要目的是:监视代码变量变化;记录服务器访问操作记录以及异常运行操作记录;进行部分统计分析工作;担当开发环境中调试器作用,输出代码调试信息。
1.2 日志系统的选择。
现在最流行的应该是logback,网上很多log4j应该替换为logback的帖子。但是项目一般都会用到很多的框架,很多框架的日志系统都是log4j,所以我们也必须在项目中加入log4j与slf4j。我们需要的jar包包括:logback.classic-1.1.1.jar、logback-core-1.1.1.jar、slf4j-api-1.7.6.jar。是简单介绍下logback的优点,当然大部分都是网上的观点摘抄。
更快的速度。某些执行速度据说快了10倍,而且内存占用也更小了。实现了SLF4j。logback-classics实现了SLF4j,可以非常容易的切换log4j。自动重载配置文件。配置文件修改后,能自动重新加载配置文件,扫描过程快速安全。堆栈树带有包版本。自动去除旧日志文件。当然还有很多其他的优缺点比较,这里只列举我比较关心的。
1.3 下载地址。
http://logback.qos.ch/download.html 可以去官方下载最新包,以及相关文档支持。
二、配置
贴一个测试的日志配置logback.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE logback> <configuration> <!-- 定义变量 下文可用${log.base} 代替d:\\logback\\logback--> <substitutionProperty name="log.base" value="/var/dc/log/server/DragonFever" /> <!-- JMX管理,logback支持使用JMX随时重载logback.xml或者单独设置某个package的level。 --> <jmxConfigurator /> <!-- 控制台输出 --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 过滤含有某字符串的日志 --> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator name="myEval"> <expression>message.contains("dao")</expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <pattern>%date %-5level [%logger{0}] %thread - %msg%n</pattern> </encoder> <!-- 从0.9.19开始 FileAppender和其子类使用encoder,不接受layout。 <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> --> </appender> <!-- 服务器日志 --> <appender name="server-log" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator name="myEval_dao"> <expression>message.contains("dao")</expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <File>${log.base}.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${log.base}_%d{yyyy-MM-dd}.log.zip</FileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%date %-5level [%logger{0}] %thread - %msg%n</pattern> </encoder> </appender> <!-- 这个应该为将日志发送远程主机,未测试 <appender name="jms_dao" class="ch.qos.logback.classic.net.JMSQueueAppender"> <InitialContextFactoryName> org.apache.activemq.jndi.ActiveMQInitialContextFactory </InitialContextFactoryName> <ProviderURL>tcp://192.168.1.120:61616</ProviderURL> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator name="myEval_service"> <expression>message.contains("dao")</expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <QueueConnectionFactoryBindingName>ConnectionFactory </QueueConnectionFactoryBindingName> <QueueBindingName>cms_dao_log</QueueBindingName> </appender> <appender name="jms_service" class="ch.qos.logback.classic.net.JMSQueueAppender"> <InitialContextFactoryName> org.apache.activemq.jndi.ActiveMQInitialContextFactory </InitialContextFactoryName> <ProviderURL>tcp://192.168.1.120:61616</ProviderURL> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator name="myEval_service"> <expression>message.contains("service.impl")</expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <QueueConnectionFactoryBindingName>ConnectionFactory </QueueConnectionFactoryBindingName> <QueueBindingName>cms_service_log</QueueBindingName> </appender> --> <logger name="com.cms5.cmsservice.jms"> <level value="DEBUG" /> </logger> <logger name="java.sql.PreparedStatement"> <level value="DEBUG" /> </logger> <logger name="java.sql.Connection"> <level value="DEBUG" /> </logger> <logger name="java.sql.Statement"> <level value="DEBUG" /> </logger> <logger name="com.ibatis"> <level value="DEBUG" /> </logger> <logger name="com.ibatis.common.jdbc.SimpleDataSource"> <level value="DEBUG" /> </logger> <logger name="com.ibatis.common.jdbc.ScriptRunner"> <level value="DEBUG" /> </logger> <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"> <level value="DEBUG" /> </logger> <logger name="com.danga.MemCached"> <level value="INFO" /> </logger> <logger name="org.springframework.test"> <level value="DEBUG" /> </logger> <logger name="org.apache.struts2"> <level value="DEBUG" /> </logger> <root> <level value="INFO" /> <!--<appender-ref ref="stdout" /> --> <appender-ref ref="logfile-dao" /> <appender-ref ref="logfile-service" /> <appender-ref ref="jms_dao" /> <appender-ref ref="jms_service" /> </root> </configuration>
粘一个别的大神正在用的,具体设置根据项目自行编写。
<?xml version="1.0" encoding="UTF-8"?> 2 <configuration> 3 4 <!-- 控制台输出 --> 5 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 6 <encoder> 7 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 8 </encoder> 9 </appender> 10 11 <!-- 时间滚动输出 level为 DEBUG 日志 --> 12 <appender name="file―debug" 13 class="ch.qos.logback.core.rolling.RollingFileAppender"> 14 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 15 <level>DEBUG</level> 16 <onMatch>ACCEPT</onMatch> 17 <onMismatch>DENY </onMismatch> 18 </filter> 19 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 20 <FileNamePattern>D:/logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern> 21 <MaxHistory>30</MaxHistory> 22 </rollingPolicy> 23 <encoder> 24 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 25 </encoder> 26 </appender> 27 28 <!-- 时间滚动输出 level为 ERROR 日志 --> 29 <appender name="file―error" 30 class="ch.qos.logback.core.rolling.RollingFileAppender"> 31 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 32 <level>ERROR</level> 33 <onMatch>ACCEPT</onMatch> 34 <onMismatch>DENY </onMismatch> 35 </filter> 36 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 37 <FileNamePattern>D:/logs/error.%d{yyyy-MM-dd}.log</FileNamePattern> 38 <MaxHistory>30</MaxHistory> 39 </rollingPolicy> 40 <encoder> 41 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 42 </encoder> 43 </appender> 44 45 <!-- 特定过滤含有某字符串的日志 --> 46 <appender name="file-str" 47 class="ch.qos.logback.core.rolling.RollingFileAppender"> 48 <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 49 <evaluator> 50 <expression>message.contains("str")</expression> 51 </evaluator> 52 <onMatch>ACCEPT</onMatch> 53 <onMismatch>DENY</onMismatch> 54 </filter> 55 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 56 <FileNamePattern>D:/logs/contains.%d{yyyy-MM-dd}.log 57 </FileNamePattern> 58 <MaxHistory>30</MaxHistory> 59 </rollingPolicy> 60 <encoder> 61 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 62 </encoder> 63 </appender> 64 65 <!-- 数据库输出 --> 66 <appender name="db" class="ch.qos.logback.classic.db.DBAppender"> 67 <connectionSource 68 class="ch.qos.logback.core.db.DriverManagerConnectionSource"> 69 <driverClass>com.mysql.jdbc.Driver</driverClass> 70 <url>jdbc:mysql://host_name:3306/datebase_name</url> 71 <user>username</user> 72 <password>password</password> 73 </connectionSource> 74 </appender> 75 76 <logger name="java.sql.Connection"> 77 <level value="DEBUG" /> 78 </logger> 79 <logger name="java.sql.Statement"> 80 <level value="DEBUG" /> 81 </logger> 82 <logger name="com.ibatis"> 83 <level value="DEBUG" /> 84 </logger> 85 <logger name="com.ibatis.common.jdbc.SimpleDataSource"> 86 <level value="DEBUG" /> 87 </logger> 88 <logger name="com.ibatis.common.jdbc.ScriptRunner"> 89 <level value="DEBUG" /> 90 </logger> 91 <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"> 92 <level value="DEBUG" /> 93 </logger> 94 <logger name="com.danga.MemCached"> 95 <level value="INFO" /> 96 </logger> 97 <logger name="org.springframework.test"> 98 <level value="DEBUG" /> 99 </logger> 100 <logger name="org.apache.struts2"> 101 <level value="DEBUG" /> 102 </logger> 103 104 <root level="DEBUG"> 105 <appender-ref ref="stdout" /> 106 <appender-ref ref="file―debug" /> 107 <appender-ref ref="file―error" /> 108 <appender-ref ref="file-str" /> 109 <appender-ref ref="db" /> 110 </root> 111 112 </configuration>