起名泛泛谈什么利用Log4j记录日志

  一.什么是log4j

序言:由于当下段时光公司之事务比较的农忙,每天还如学新的东西,所以老没写博客了,今天抽空写写博客来记录自己及时段日子研究的东西,给协调加深一下记忆,我之所以easyUI的组件开发了一个简单易行操作数据库的略样例,一些常用的数据库操作都落实了,希望能跟博客园里面的博主曹交流交流看法。

 Log4J是Apache的一个绽放源代码的项目。通过运用Log4J,程序员可以操纵日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也堪控制每一样长长的日志的出口格式,或透过定义每一样长日志信息的级别,更加细致地控制日志的转移过程。

先是自己之所以之开支环境是Visual Studio 2010,ASP.NET MVC2.0,SQL
SERVER2005,我所以的NHibernate的本是1.2.1,Spring.net的版是1.1.0。

  二.日志及分类

首先在此处用自家之迷惑先说出去,希望有人能够为自身解答解答,在这边谢罢了,我在用本的当儿自己发觉NHibernate1.2.1跟spring.net1.1.0(低版本)结合最好,Nhibernate3.0和spring.net
1.3.1(高版本)结合做好,不懂得自己的认为正确吧?但是小版本的言语未可知利用Nhibernate.Linq,只有Nhibernate3.0以上的本支持Nhibernate,但是大版本的说话我们项目里面有一个作用我们无召开下,就是我们有意把数据库的连年字符串写错误,然后我尽不经数据操作的页面的话,比如是页面我就是输出一词话,但是呢会见报错,说无法连接数据库,用户登录失败,但是自己怀念如果的凡于并未操作数据库的页面可以正常显示,在操作数据库的页面在提醒错误即可?不知道谁博友有什么好措施也?这种功能在没有版本下面我得以实现了。

     
软件之运作过程中去不起来日志,日志主要为此来记录系统运转过程被之有根本之操作信息,便于监视系统运行时的景象,帮助用户提前意识和逃避可能出现的题目,或者出现问题后因日志找到有的缘由。

  1. 第一步:建立数据库

 
 日志根据记录的不等,主要分为三类:

(1)    打开数据库SQL Server
2005,新建一个数据库bjk241,然后重新是数据库被新盖同等摆放表,起名为:User_DepInfo,用来存放我们录入的数据,表底树样式如下图所示:

1.SQL日记:记录系统推行之sql语句。

 

2.异常日志:记录系统运行面临起的不行事件。

起名 1

3.事务日志:记录系统运行过程,如用户之登录,操作记录。

  1. 第二步:建立项目,类库等

三.布局文件说明

(1) 打开Visual Studio 2010会师成支付环境,在Visual Studio
2010受到树立一个ASP.MVC
2.0之项目,给品种其名是NewKJ241,将见面变微软查封装好之自带的MVC的满架构结构,然后于路内建立几个类库,用来存放在我在后建立的片门类,当我们成立好后如图所示:

1、定义配置文件
Log4j支持有限栽配备文件格式,一种植是XML格式的文本,一种是Java特性文件log4j.properties(键=值)。下面用介绍以log4j.properties文件作为配置文件之艺术:
①配置根Logger
Logger 负责处理日志记录的绝大多数操作。
那个语法为:
log4j.rootLogger = [ level ] ,
appenderName, appenderName, …
内部,level
是日记记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者打定义的级别。Log4j建议才以四只级别,优
先级从高到小分别是ERROR、WARN、INFO、DEBUG。通过以这里定义的级别,您可以控制及应用程序中相应级别之日记信息的开关。比如以此地定
义了INFO级别,只有等跟超过这个级别的才进行拍卖,则应用程序中保有DEBUG级别之日记信息以无让打印出。ALL:打印所有的日志,OFF:关
闭所有的日记输出。
appenderName就是点名日志信息输出到谁地方。可又指定多单出口目的地。
②布局日志信息输出目的地 Appender
Appender 负责控制日志记录操作的出口。
那语法为:
log4j.appender.appenderName =
fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 =
value1
log4j.appender.appenderName.optionN =
valueN
此的appenderName为于①里定义的,可随便起名。
中间,Log4j提供的appender有以下几种植:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天来一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的上发出一个新的文本),可由此
log4j.appender.R.MaxFileSize=100KB设置文件大小,还只是通过
log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。
org.apache.log4j.WriterAppender(将日志信息为流格式发送至自由指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
概念一个号称也stdout的出口目的地,ConsoleAppender为控制台。
③配备日志信息之格式(布局)Layout
Layout 负责格式化Appender的输出。
那语法为:
log4j.appender.appenderName.layout =
fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 =
value1

log4j.appender.appenderName.layout.optionN =
valueN
其中,Log4j提供的layout有以下几种植:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信字符串),
org.apache.log4j.TTCCLayout(包含日志产生的辰、线程、类别等等信息)
2、格式化日志信息
Log4J采用类似C语言中之printf函数的由印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的信
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动至输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的真名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日子或时间,默认格式为ISO8601,也得以以该后指定格式,比如:%d{yyyy
MMM dd HH:mm:ss,SSS},输出接近:2002年10月18日 22:10:28,921
%l 输出日志事件之发生位置,包括类目名、发生的线程,以及当代码中的行数。

 

四.如何使用log4j记录日志

起名 2

 
 要使用log4j记录日志,首先使下载log4j的jar文件,官方网站是http://logging.apache.org/log4j。当前下载地址是:http://logging.apache.org/log4j/1.2/dowload.html.下载好该文件,解压后有一个apache-log4j-1.2.17\\log4j-1.2.17.jar文件.

(2)
当我们看到这张图的当儿,我们是勿是以纳闷这都是胡的也罢?不要心急,下面我就算介绍一下逐项品种及类库的用意。

先是步:在路面临入log4j所采取的jar文件

  1)
首先我们视了NewKJ241里面的情与咱们刚刚起之无一致吧,那是坐自身重新建了几独公文夹,将从未的公文夹介绍一下,Configs文件夹里面放的凡spring.net的XML节点,实现之企图是链接数据库与投整个框架,下面我会详细介绍的,dlls文件夹里面放的凡咱们所假设引用的dll,如图所示:

 
 首先以档次遭到创造一个lib文件夹,把欠文件复制该公文中。然后针对已复制过来的jar包鼠标点击右键,选中BuildPath
 ——–》Add to Build Path
然后若见面以路面临看看多了一个引入外包的花色:Library

 

起名 3

起名 4

第二步:创建log4j.properties文件

,easyUI文件夹里面是存的凡咱们需要引用的easyUI的类库,其他的还是建立的时候自动生成的,后面会讨论的。

 
选择要利用的log4j项目,点击src,依次选择New————》File———New
File——–》输入文件称,单击Finish按钮,结束创建。‘

  2) NewKJ241.Model类库的来意是存放在映射的数据库的文本。

老三步:编写log4j.properties文件,配置日志信息。

  3)
NewKJ241.IDao类库的打算是兑现了咱们所待的当路遭到落实数据库方法的接口。

log4j.rootLogger=Info,file, stdout


### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

  4) NewKJ241.
NhibernateDao类库的意是实现了IDao的接口,完成了接口所而贯彻之艺术的代码。

五.日志及级别

 
5)NewKJ241.IBLL类库的打算是实现了俺们以项目被如以Spring.NET所假设使的接口,和NewKJ241.IDao接口的写法一模一样。

每个Logger都深受了一个日记级别(log
level),用来支配日志信息之出口。日志级别由大顶小分为:
01.off       
 最高阶段,用于关闭所有日志记录。
02.fatal      
指出每个严重的左事件将会晤促成应用程序的退出。
03.error      指出虽然发生误事件,但还是不影响系的持续运行。
04.warm     表明会出现神秘的一无是处情形。
05.info         一般和当粗粒度级别及,强调应用程序的周转全程。
06.debug     一般用来细粒度级别达,对调节应用程序非常有辅助。
07.all          
最低级,用于打开所有日志记录。

 
6)NewKJ241.BLL类库的不二法门是落实了Nhibernate的落实方式,继承自IBLL项目,是为了利用Spring.NET所描写的方法。

六.于次中利用lpg4j记录日志

下我不怕讲自己形容的物详细的叙说一下,有啊不足或缺点我们得以讨论。

package cn.hyj.one;
import org.apache.log4j.Logger;
public class Test {

    //通过Logger的getLogger获取一个Loogger实例
    public static Logger lo=Logger.getLogger(Test.class);
    public static void main(String[] args) {
        try {
            int result=5/0;//出现异常
        } catch (Exception e) {
            System.out.println("除数不能为零!");
            lo.info("除数不能为0");//保存日志
        }

    }
}
  1. 其三步:NHibernate映射文件

 

(1)
首先我们只要投出数据库中表的音信的文件,这里我们怎么映射呢,那么基本上的代码??别着急,我们可以就此一个自动生成映射文件之机件CodeSmith软件,这个软件可以便捷的扶我们生成映射文件,关于这个软件怎么使好关押自己先写的篇博客,那里详细的叙述了怎样采取这个软件:http://www.cnblogs.com/hanyinglong/archive/2012/04/21/2462302.html。

(2)
接下来我们以NewKJ241.Model里面建立一个文件夹Mappings,在是文件夹里面我们存放了照的文本,生成之后附加到花色蒙如图所示:

 

起名 5

1) 
UserDepInfo的来意是定义数据库中之字段,再用CodeSmith生成的时候模式字段属性是无加Virtual的,我们人为的吃许段属性加上,代码如下:

        protected int _id;

        protected int _depID;

        protected string _depName;

        public UserDepInfo() { }

        public UserDepInfo(int depID, string depName)

        {

            this._depID = depID;

            this._depName = depName;

        }

        public virtual int Id

        {

            get { return _id; }

            set { _id = value; }

        }

        public virtual int DepID

        {

            get { return _depID; }

            set { _depID = value; }

        }

        public virtual string DepName

        {

            get { return _depName; }

            set

            {

                if (value != null && value.Length > 50)

                    throw new ArgumentOutOfRangeException(“Invalid value
for DepName”, value, value.ToString());

                _depName = value;

            }

        }

2)
然后映射文件之代码如下:注意,在此地我们用拿此XML文件改化嵌入的资源,不然后面我们先行不了职能,怎么转呢?很粗略,右键——属性——生成操作改成为嵌入的资源,这样虽OK了,前期准备工作好了下面我们就算开始勾画方法了。在此处以看无懂得是呀意思的,可以拘留自己的博客:http://www.cnblogs.com/hanyinglong/archive/2012/04/20/2459314.html。

<?xml version=”1.0″ encoding=”utf-8″ ?>

<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.2″

                   assembly=”NewKJ241.Model.UserDepInfo”

                   namespace=”NewKJ241.Model.UserDepInfo”>

  <class name=”NewKJ241.Model.UserDepInfo,NewKJ241.Model”
table=”User_DepInfo” lazy=”false”>

   
<!–下面是使用缓存所运用的同句话,但是本项目里的二级缓存注释掉了,所以这里为诠释–>

    <!–<cache usage=”read-write”/>–>

    <!–部门表明主键ID–>

    <id name=”Id” type=”Int32″ unsaved-value=”null”>

      <column name=”ID” length=”4″ sql-type=”int” not-null=”true”
unique=”true”/>

      <generator class=”native” />

    </id>

    <!–部门表ID–>

    <property name=”DepID” type=”Int32″>

      <column name=”DepID” length=”4″ sql-type=”int”
not-null=”false”/>

    </property>

    <!–部门表明名称–>

    <property name=”DepName” type=”String”>

      <column name=”DepName” length=”50″ sql-type=”varchar”
not-null=”false”/>

    </property>

  </class>

</hibernate-mapping>

  1. 季步:建立Dao接口,实现操作数据库的方式

(1)
在NewKJ241.IDao类库下面新建一个近乎,起名为:IUserDepInfoDao,然后以此类中写如落实方式的接口,代码如下:

  //where表明了针对项目变量T的约关系,where T :
class表示项目变量T是继续自class或者class本身

    public interface IUserDepInfoDao<T> where T : class

    {

        /// <summary>

        /// 获取实体

        /// </summary>

        /// <param name=”id”>主键</param>

        /// <returns>实体</returns>

        T Get(object id);

 

        /// <summary>

        /// 获取实体

        /// </summary>

        /// <param name=”id”>主键</param>

        /// <returns>实体</returns>

        T Load(object id);

 

        /// <summary>

        /// 插入实体

        /// </summary>

        /// <param name=”entity”>实体</param>

        /// <returns>插入的多少</returns>

        object Save(T entity);

 

        /// <summary>

        /// 修改实体

        /// </summary>

        /// <param name=”entity”>实体数据</param>

        void Update(T entity);

 

        /// <summary>

        /// 保存要涂改实体

        /// </summary>

        /// <param name=”entity”>实体数据</param>

        void SaveOrUpdate(T entity);

 

        /// <summary>

        /// 删除实体

        /// </summary>

        /// <param name=”id”>主键ID</param>

        void Delete(object id);

 

        /// <summary>

        /// 删除实体

        /// </summary>

        /// <param
name=”odList”>主键ID的集结,删除多单项</param>

        void Delete(string idList);

 

        /// <summary>

        ///读取如果用户不输入外信息进行询问的艺术

        /// </summary>

        /// <param name=”sort”>按照有字段进行排序</param>

        /// <param name=”order”>按照有字段进行排序</param>

        /// <returns></returns>

        IList<UserDepInfo> loadByAll(string sort, string order);

 

        /// <summary>

        /// 读取用户输入条件进行查询的法门

        /// </summary>

        /// <param name=”sort”>按照有字段进行排序</param>

        /// <param name=”order”>按照有字段进行排序</param>

        /// <param name=”name”>只用户输入的音信</param>

        /// <returns></returns>

        IList<UserDepInfo> loadAllCheck(string sort, string order,
string name);

 

        /// <summary>

        ///

        /// </summary>

        /// <param name=”total”>总的多少</param>

        /// <param name=”page”>当前底页数</param>

        /// <param name=”rows”>每页所著的数目</param>

        /// <param name=”order”>按照有字段进行排序</param>

        /// <param name=”sort”>按照有字段进行排序</param>

        /// <param name=”DepName”>只用户输入的信</param>

        /// <returns></returns>

        IList<UserDepInfo> LoadAllByPage(out long total, int page,
int rows, string order, string sort, string DepName);

}

此就是从不什么说的了,写法都异常稳定!!

  1. 第五步:建立NhibernateDao项目,实现IDao接口的点子

(1)
在NewKJ241.Nhibernate类库下面建立类似,起名为:UserDepInfoDao,在拖欠法被延续自IDao接口,实现了IDAO接口里面的备办法,在书本代码的时段,我们要引入dll,引入的dll如图所示:

 

起名 6

代码如下:

 public class UserDepInfoDao<T> : HibernateDaoSupport,
IUserDepInfoDao<T> where T : class

    {

        public T Get(object id)

        {

            return this.HibernateTemplate.Get<T>(id);

        }

 

        public T Load(object id)

        {

            return this.HibernateTemplate.Load<T>(id);

        }

 

        public virtual object Save(T entity)

        {

            return this.HibernateTemplate.Save(entity);

        }

 

        public void Update(T entity)

        {

            this.HibernateTemplate.Update(entity);

        }

 

        public void SaveOrUpdate(T entity)

        {

            this.HibernateTemplate.SaveOrUpdate(entity);

        }

 

        public void Delete(object id)

        {

            var entity = this.HibernateTemplate.Get<T>(id);

            if (entity == null)

            {

                return;

            }

            else

            {

                this.HibernateTemplate.Delete(entity);

            }

        }

 

        public void Delete(string idList)

        {

            string[] idl = idList.Split(‘,’);

            int len = idl.Length;

            for (int i = 0; i < len; i++)

            {

                var entity =
this.HibernateTemplate.Get<T>(int.Parse(idl[i].ToString()));

                if (entity == null)

                {

                    return;

                }

                else

                {

                    this.HibernateTemplate.Delete(entity);

                }

            }

        }

 

        public IList<UserDepInfo> loadByAll(string sort, string
order)

        {

            string hql = “from UserDepInfo order by ” + sort + ” ” +
order;

            return
this.HibernateTemplate.Find<UserDepInfo>(hql).ToList();

 

        }

 

        public IList<UserDepInfo> loadAllCheck(string sort, string
order, string name)

        {

            string hql = “from UserDepInfo where DepName like ? order by
” + sort + ” ” + order;

            return this.HibernateTemplate.Find<UserDepInfo>(hql,
new object[] { “%” + name + “%” }).ToList();

        }

 

 

        public IList<UserDepInfo> LoadAllByPage(out long total,
int page, int rows, string order, string sort, string DepName)

        {

            IList<UserDepInfo> list = null;

            if (DepName == null)

            {

                list = this.loadByAll(sort, order);

            }

            else

            {

                list = this.loadAllCheck(sort, order, DepName);

            }

            total = list.LongCount();

            list = list.Skip((page – 1) * rows).Take(rows).ToList();

            return list;

        }

}

嗬,工作一样天了,累了,回学校了,明天前仆后继,今天描绘的这些都是基础,后面还见面当写这个项目的,一直顶这路写了!!,也是极端有知识点了,所谓学吧,一步一个脚印,慢慢来吧!!!

 

下载地址:http://www.chuxinm.com/Shop/Detail/Detail?id=b88e9907dbaa4b3db297443081ab238d

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图