1、项目目录结构图,lib包引入了一些关于common logging+log4j2相关的jar。
2、编写相关的build.xml
<?xml version="1.0" encoding="utf-8"?> <!--定义生成文件的project根元素,默认的target为空--> <project name="log4j2Test" basedir="." default="all"> <target name="all" depends="help,init,compile,build,run,clean"> <echo>Finish!</echo> </target> <!--定义4个简单属性--> <property name="src" value="src"/> <property name="classes" value="classes"/> <property name="lib" value="lib"/> <property name="dest" value="dest"/> <property name="log" value="log"/> <!--定义help target,用于输出该生成文件的帮助信息--> <target name="help" description="打印帮助信息"> <echo>help - 打印帮助信息</echo> <echo>complie - 编译Java源文件</echo> <echo>run - 运行程序</echo> <echo>build - 打包Jar包</echo> <echo>clean - 清除所有编译生成的文件</echo> </target> <!--init target,初始化--> <target name="init"> <delete dir="${classes}"/> <mkdir dir="${classes}"/> <delete dir="${dest}"/> <mkdir dir="${dest}"/> <delete dir="${log}"/> <mkdir dir="${log}"/> </target> <!--定义一组文件路径集--> <path id="classpath"> <fileset dir="${lib}"> <include name="**/*.jar"/> </fileset> <pathelement path="${classes}"/> </path> <!--定义complie target,用于编译Java源文件--> <target name="compile" description="编译java源文件"> <!--编译java文件,编译后的class文件放到classes属性所代表的文件夹内--> <javac destdir="${classes}" includeantruntime="yes" encoding="utf-8"> <!--指定需要编译的Java文件所在的位置--> <src path="${src}"/> <!--指定编译Java文件所需要的第三方类库所在的位置--> <classpath refid="classpath"/> </javac> </target> <!--定义build target,用于打包jar文件,运行该target之前会先运行compile target--> <target name="build" description="打包jar文件" depends="compile"> <!--将项目中除编译生成class文件的java文件之外的其他类型文件拷贝到对应的文件夹--> <copy todir="${classes}"> <fileset dir="."> <include name="log4j2.xml"/> <include name="说明.txt"/> </fileset> </copy> <!--指定将classes属性所代表的文件夹下的所有*.class文件都打包到app.jar文件中--> <jar destfile="${dest}/app-1.0.2.jar" basedir="${classes}" includes="**/*.class **/*.xml **/*.txt"> <!--为jar包的清单文件添加属性--> <manifest> <attribute name="Main-Class" value="src.com.lfy.Student"/> </manifest> <!--将相关被引用的包以解压后的方式打包进jar包中--> <zipfileset src="${lib}/commons-logging-1.2.jar"></zipfileset> <zipfileset src="${lib}/log4j-jcl-2.12.0.jar"></zipfileset> <zipfileset src="${lib}/log4j-core-2.12.0.jar"></zipfileset> <zipfileset src="${lib}/log4j-api-2.12.0.jar"></zipfileset> </jar> <!--打包第3方jar通过引用的方式运行的可执行jar--> <jar destfile="${dest}/app-1.0.3.jar" basedir="${classes}" includes="**/*.class **/*.xml **/*.txt"> <!--为jar包的清单文件添加属性--> <manifest> <attribute name="Main-Class" value="src.com.lfy.Student"/> </manifest> <!--将相关被引用的包以解压后的方式打包进jar包中--> <zipfileset src="${lib}/commons-logging-1.2.jar"></zipfileset> <zipfileset src="${lib}/log4j-jcl-2.12.0.jar"></zipfileset> <zipfileset src="${lib}/log4j-core-2.12.0.jar"></zipfileset> <zipfileset src="${lib}/log4j-api-2.12.0.jar"></zipfileset> </jar> </target> <!--定义run target,用于运行Java源文件,运行该target之前会先运行compile target--> <target name="run" description="运行程序" depends="compile"> <!--运行lfy.HelloWorld类,其中fork指定启动另一个JVM来执行Java命令--> <java classname="src.com.lfy.Student" fork="yes" failonerror="true"> <classpath refid="classpath"/> <!--运行Java程序时传入2个参数--> <arg line="测试参数1 测试参数2"/> </java> <!--运行可执行jar文件--> <java jar="${dest}/app-1.0.2.jar" fork="yes" failonerror="true"> <!--运行Java程序时传入2个参数--> <arg line="p1 p2"/> </java> <java jar="${dest}/app-1.0.3.jar" fork="yes" failonerror="true"> <!--运行Java程序时传入2个参数--> <arg line="p1 p2"/> </java> </target> <!--定义clean target,用于删除所有编译生成的文件--> <target name="clean" description="清除所有编译生成的文件"> <delete dir="${classes}"/> <delete dir="${dest}"/> <delete dir="${log}"/> </target> </project>
3、编写log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <!-- 定义日志格式 --> <Property name="log.pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property> <!-- 定义文件名变量 --> <Property name="file.all.filename">log/all.log</Property> <Property name="file.all.pattern">log/all.%i.log.gz</Property> <Property name="file.err.filename">log/err.log</Property> <Property name="file.err.pattern">log/err.%i.log.gz</Property> </Properties> <!-- 定义Appender,即目的地 --> <Appenders> <!-- 定义输出到控制台 --> <Console name="console" target="SYSTEM_OUT"> <!-- 日志格式引用上面定义的log.pattern --> <PatternLayout pattern="${log.pattern}"/> </Console> <!-- 定义输出到文件,文件名引用上面定义的file.all.file.filename --> <RollingFile name="all" bufferedIO="true" fileName="${file.all.filename}" filePattern="${file.all.pattern}"> <PatternLayout pattern="${log.pattern}"/> <Policies> <!-- 根据文件大小自动切割日志 --> <SizeBasedTriggeringPolicy size="10 KB" /> </Policies> <!-- 保留最近5份 --> <DefaultRolloverStrategy max="5" /> </RollingFile> <!-- 定义输出到文件,文件名引用上面定义的file.err.file.filename --> <RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}"> <PatternLayout pattern="${log.pattern}"/> <Policies> <!-- 根据文件大小自动切割日志 --> <SizeBasedTriggeringPolicy size="2 KB" /> </Policies> <!-- 保留最近5份 --> <DefaultRolloverStrategy max="5" /> </RollingFile> </Appenders> <Loggers> <Root level="info"> <!-- 对info级别的日志,输出到console --> <AppenderRef ref="console" level="info"/> <!-- 对info级别的日志,输出到all,即上面定义的RollingFile --> <AppenderRef ref="all" level="info"/> <!-- 对error级别的日志,输出到err,即上面定义的RollingFile --> <AppenderRef ref="err" level="error"/> </Root> </Loggers> </Configuration>
4、编写Person.java、Student.java
Person.java
package src.com.lfy; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Person{ /** * 使用LogFactory.getLog(getClass()),也可以使用LogFactory.getLog(Person.class) * 前者可以使子类的实例直接使用log,看Student.java中的代码 */ protected final Log log=LogFactory.getLog(getClass()); void foo(){ log.info("Person.foo()"); } }
Student.java
package src.com.lfy; public class Student extends Person{ void bar(){ log.info("Student.bar()"); try{ int a=5,b=1; b=a/0; }catch(Exception e){ //捕获异常非常简单 log.error("got exception",e); } } public static void main(String[] agrs){ Student stu=new Student(); stu.bar(); } }
5、运行结果
6、总结:实现了简单的log4j应用。