在上面提及异常的中英文从资源文件中读取,若读取失败需要日志记录,所以使用网上正在闹腾的Logback来记录。关于Logback与Log4j这里不做评判和说明,所有疑问可以请教谷歌。

一、Logback的使用前期准备

1、在官网http://logback.qos.ch/download.html下载Logback;在官网http://www.slf4j.org/download.html下载slf4j

2、在D:\medical\war\WEB-INF下创建lib文件夹,用于放置本应用的所需JAR包

3、解压上面的下载,把logback-access-1.0.13.jar、logback-classic-1.0.13.jar、logback-core-1.0.13.jar和slf4j-api-1.7.5.jar复制到D:\medical\war\WEB-INF\lib中

二、测试类

下面着手写一个与本应用无关的测试类FrameLogger.java

1、打开Eclipse,在medical工程上右键,选择“New > Class”,Package填写“com.medical.frame”,Name填写“FrameLoggerDemo”,点击“Finish”

2、要使用日志类,应用先定义一个Logger,然后再使用这个对象,所以代码如下:

package com.medical.frame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FrameLoggerDemo
{private static final Logger logger = LoggerFactory.getLogger(FrameLoggerDemo.class);public static void main(String[] args){logger.info("It's test for logback.");}
}

3、你会发现上面代码编译不通过。这很正常,因为Eclipse没有导入所需的jar包。右键medical工程选择“Properties > Java Build Path > Libraries > Add JARs...”,在JAR选择窗口中把D:\medical\war\WEB-INF\lib下的jar包添加进来,如图:

4、我想不仅把日志打印到控制台还要打印到日志文件中,更甚者想插入到数据库中,XML配置文件可以协助完成。在D:\medical\war\下创建etc文件夹,然后在etc下创建logconfig.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--日志文件的存储地址,一定要使用绝对路径--><property name="LOG_HOME" value="D:/log" /><!--日志文件后缀格式--><timestamp key="fileSuffix" datePattern="yyyyMMdd'_'HHmm" /><!--控制台输出--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!--输出在控制台上的日志字符串编码--><Encoding>UTF-8</Encoding><!--输出在控制台上的日志格式--><layout class="ch.qos.logback.classic.PatternLayout"><!--%d表示日期; %thread表示线程名; %-5level表示从左显示5个字符宽度的级别名; %logger表示日志类; %msg表示日志消息; %n表示换行--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} - %msg%n</pattern></layout></appender><!--文件输出--><appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender"><!--输出在控制台上的日志字符串编码--><Encoding>UTF-8</Encoding><!--日志对应的文件名--><file>${LOG_HOME}/trace${fileSuffix}.txt</file><!--日志文件记录滚动策略--><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><!--当日志文件超过大小时就压缩为zip包--><fileNamePattern>${LOG_HOME}/trace${fileSuffix}.%i.zip</fileNamePattern><!--最多有10个zip压缩包,超过10就覆盖之前的--><minIndex>1</minIndex><maxIndex>10</maxIndex></rollingPolicy>  <!--文件超过5M就重新生成新的日志文件,老的日志文件压缩成zip包--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><!--输出在文件上的日志格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} - %msg%n </pattern></encoder></appender><!--日志输出级别--><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root>
</configuration>

【备注】:关于这个配置文件建议感兴趣的读者,自己亲自配置一下,这样才能体验每个标签的含义。


5、运行FrameLoggerDemo发现并没有在指定的D:/log下输出日志文件。试想一下,我们都没有告诉Logback输出策略是什么,它怎么又会知道呢?所以这里需要在main()运行之前把logconfig.xml加载进来,怎么加载?怎么只加载一次?方法很多,可以使用Spring的单例工厂,而这里我们使用单例类。

private static FrameLoggerDemo instance = new FrameLoggerDemo();private FrameLoggerDemo()
{String logbackCfg = "D:\\medical\\war\\etc\\logconfig.xml";ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();JoranConfigurator configurator = new JoranConfigurator();configurator.setContext((LoggerContext) loggerFactory);try{configurator.doConfigure(logbackCfg);}catch (JoranException e){e.printStackTrace();}
}

再运行一次,有日志文件输出出来了

三、斗医应用如何使用Logback呢?

从上面的FrameLoggerDemo可以看到,系统在使用Logger对象之前必须把配置文件加载进来,对于web应用它由多个Servlet构成,所以最好在第一个Servlet启动时加载进来,后续的使用者就直接使用即可。

1、在D:\medical\war\WEB-INF\web.xml中定义名称为action的servlet

<web-app><servlet><servlet-name>action</servlet-name><servlet-class>com.medical.frame.FrameLauncher</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.act</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list>
</web-app>

2、该servlet说明当客户端的请求为*.act时,都使用名称为action的servlet处理,处理器为FrameLauncher这个类,它必须继承HttpServlet。Servlet一般由init、doGet、doPost、destory方法构成,所以FrameLauncher也不例外,它需要重写这4个方法。

package com.medical.frame;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*** 斗医系统动作登陆类*/
public class FrameLauncher extends HttpServlet
{@Overridepublic void init() throws ServletException{}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{}@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException{doGet(request, response);}@Overridepublic void destroy(){}
}

3、当request请求到达Web容器时,它会根据请求参数判断使用哪个servlet处理,当servlet首次被调用到时,它会反射<servlet-class>定义的类,再调用init()方法进行初始化。而我们的日志加载就可以在这里处理。

定义com.medical.frame.util.FrameConfigUtil.java,里面定义静态方法initLogConfig()用于加载logback日志配置文件。

public class FrameConfigUtil
{/*** 加载Logback日志配置文件*/public static void initLogConfig(ServletContext context){// 获取logback配置文件StringBuilder logConfigPath = new StringBuilder(context.getRealPath("/"));logConfigPath.append("etc").append(File.separator).append("logconfig.xml");// 加载logback配置文件ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();JoranConfigurator configurator = new JoranConfigurator();configurator.setContext((LoggerContext) loggerFactory);try{configurator.doConfigure(logConfigPath.toString());}catch (JoranException e){System.out.println("[重要] init logback config error.\n" + e.getMessage());}}
}

4、FrameLauncher.init()方法调用FrameConfigUtil.initLogConfig()

@Override
public void init() throws ServletException
{ServletContext context = getServletContext();FrameConfigUtil.initLogConfig(context);
}

至此logback的配置文件在action这个servlet初始化时就加载完了,那该如何测试呢?

5、修改D:\medical\war\index.html文件内容,修改后的内容如下:

<html><head><title>medical</title>   </head><body><a href="index.act">Test Logback</a></body>
</html>

6、重写com.medical.frame.FrameLauncher.doGet()方法

/*** 定义日志对象*/
private static final Logger logger = LoggerFactory.getLogger(FrameLauncher.class);
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException
{logger.error("It's test for logback.");
}

这样当在浏览器中输入http://localhost:8080/medical时,由web.xml的<welcome-file-list>定义知系统首先加载index.html文件,当用鼠标点击Test Logback会index.act的HTTP请求发送给Tomcat容器,Tomcat根据web.xml的<url-pattern>*.act</url-pattern>找到对应的<servlet-name>action</servlet-name>,然后反射加载com.medical.frame.FrameLauncher.java,当FrameLaucher加载时调用init()方法把logconfig.xml读入,接着把HTT请求转换为HttpServletReqeust请求交给doGet(),从而把日志打印出来。


【备注1】:若用户从头到尾地写这个应用,有可能会发现,尽管在D:\log下生成了日志文件,但里面没有内容,这有可能是在加载logconfig.xml时使用的JoranConfigurator不正确。应该使用import ch.qos.logback.classic.joran.JoranConfigurator,而非import ch.qos.logback.access.joran.JoranConfigurator。

【备注2】:若在实际操作这个实例时遇到问题,可参见附件,也可评论以便及时交流


转载于:https://blog.51cto.com/qingkechina/1308932

【斗医】【3】Web应用开发20天相关推荐

  1. 【斗医】【11】Web应用开发20天

    本文在上文的基础上完成用户登录验证功能. 四.获取数据请求业务处理封装 1.配置数据读取方式,它的作用是使用FrameDataGainer响应以.data结尾的请求,并把处理后的数据返回给客户端.打开 ...

  2. 【斗医】【18】Web应用开发20天

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/154492 ...

  3. 【斗医】【13】Web应用开发20天

    在上文中完成用户注册/登录后显示用户名的功能,同时也谈了谈系统编码问题,本文重点聊聊"下战书"功能,里面涉及第三方在线HTML编辑器的问题. 一.Navicat for MySQL ...

  4. 【斗医】【10】Web应用开发20天

    本文在前面封装Hibernate工具的基础上重点完成用户登录功能,目前系统页面展示的名称是在HTML中写死的,所以下面要做的事:若用户已登录则显示用户名:若用户未登录则点击进入登录页面. 一.修改登录 ...

  5. 推荐20个很有帮助的 Web 前端开发教程

    在平常的搜索中,我碰到过很多有趣的信息,应用程序和文档,我把它们整理在下面这个列表.这是收藏的遇到的有用内容的一个伟大的方式,可以在你需要的时候方便查阅.相信你会在这个列表中发现对你很有用的资料. 您 ...

  6. 给 Web 前端开发人员推荐20款 CSS 编辑器

    CSS 和 HTML,JavaScript 是网页的基础,作为前端开发人员,对这三者都要很熟悉.特别是未来流行全栈开发的时代,每项技术都是你知识结构中必要的一个节点. 在开发中,选择好工具是非常重要的 ...

  7. python开发web项目_Django2:Web项目开发入门笔记(20)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这一篇教程,我们一起来了解如何在CentOS系统中将Django2的Web项目部署到Nginx服务器. CentOS系统虽然和Ubuntu系统都是Linu ...

  8. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  9. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

最新文章

  1. 什么是方向图乘积定理_课本上没有,但十分好用的初中数学定理公式
  2. 配置JDKAndroid 2D游戏引擎AndEngine
  3. thinkphp5每周学习总结1019
  4. pycharm里鼠标右键失效解决方法
  5. 【Java入门】桌球小游戏
  6. PC端设置每行固定三个元素多余换行
  7. 贪吃蛇C语言源码与算法分析
  8. 计算机科学素养大赛,第六届全国大学生计算机应用能力与信息素养大赛圆满结束...
  9. 基于stylus的border一像素线问题与ellipsis多行的兼容方案
  10. vb连接mysql_vb.net连接mysql 数据库方法
  11. 最新计算机主板参数,电脑主板参数知识
  12. python 自动化运维小工具——子网掩码计算——随机密码生成
  13. Robotium-基础理论介绍
  14. 12 经络的走向图和说明
  15. Python:利用xlwt设置Excel单元格格式
  16. arcgis for android(二)显示二维地图
  17. 【Linux】僵尸进程(Z状态)和孤儿进程
  18. busybox的实现原理分析(C语言实现简易版的busybox)
  19. java sleep的意义_java 线程Thread.Sleep详解 Thread.Sleep(0)的作用
  20. tensorflow的优势

热门文章

  1. 教程:VS2010 之TFS入门指南
  2. Asp.net生成工作流、审批流的解决方案
  3. 怎样修改WIN7下的host文件
  4. CPU各寄存器的作用
  5. shell编程之if判断总结
  6. 查看容器ID以及如何在docker和宿主机之间复制文件
  7. Leetcode算法题(C语言)12--旋转图像
  8. LeetCode 404. Sum of Left Leaves
  9. C语言中Uint8_t数据类型
  10. CPU的大端模式(big endian)和小端(little endian)模式