我是一个新入行的菜鸟,现在在做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>