博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wojilu日志系统-可以单独使用
阅读量:5837 次
发布时间:2019-06-18

本文共 5631 字,大约阅读时间需要 18 分钟。

系统位置 \wojilu\Log

一个日志系统,可以说简单,一个类就可以实现了,类里面也只需要大概10行代码就可以了。

using
 System;
using
 System.Diagnostics;
using
 System.Collections.Generic;
using
 System.Web;
using
 System.IO;
///
 
<summary>
///
 Summary description for clsException
///
 
</summary>
public
 
static
 
class
 clsException
{
    
public
 
static
 
void
 ExceptionDealer(String ex)
    {
        String LogFileName 
=
 UrlBase 
+
 
@"
\LOG\Error.log
"
;
        StreamWriter Errlog 
=
 
new
 StreamWriter(LogFileName, 
true
);
        Errlog.WriteLine(
"
Date-Time:
"
 
+
 DateTime.Now.ToString());
        Errlog.WriteLine(
"
Exception:
"
 
+
 ex.ToString());
        Errlog.Close();
        Errlog 
=
 
null
;
    }
}

 这样一个类,可以进行异常的日志了。不过,这个是懒人的日志类,下面看看做框架的同志是怎么设计日志类的。

1.定义日志消息等级:

      一个日志,应该有多个等级,普通的信息,警告,错误。。。。先来一个枚举。

using
 System;
namespace
 wojilu.Log {
    
public
 
enum
 LogLevel {
        None,
        Fatal,
        Error,
        Warn,
        Info,
        Debug,
        All
    }

    当然,如果要做的足够复杂的话,我们还可以定义一个ILogLevel的接口,这样就可以自定义LogLevel了。例如ASP_Err,Game_Info等等。什么都可以自定义,才是王道阿。。。 

2.每种LOG都要有自己的输出方式,OK,这里就要用上接口了。ILOG接口。。。

 1 
using
 System;
 2 
namespace
 wojilu {
 3 
 4 
    
///
 
<summary>
 5 
    
///
 ÈÕÖ¾½Ó¿Ú
 6 
    
///
 
</summary>
 7 
    
public
 
interface
 ILog {
 8 
 9 
        
void
 Debug( String message );
10 
        
void
 Info( String message );
11 
        
void
 Warn( String message );
12 
        
void
 Error( String message );
13 
        
void
 Fatal( String message );
14 
15 
        String TypeName { 
set
; }
16 
    }
17 
18 
}

不但输出需要统一接口,连Message信息,我们也要统一接口,继续增加接口

 1 
using
 System;
 2 
 3 
namespace
 wojilu.Log {
 4 
 5 
    
///
 
<summary>
 6 
    
///
 ÈÕÖ¾ÐÅÏ¢½Ó¿Ú
 7 
    
///
 
</summary>
 8 
    
public
 
interface
 ILogMsg {
 9 
10 
        String LogLevel { 
get
set
; }
11 
        DateTime LogTime { 
get
set
; }
12 
        String Message { 
get
set
; }
13 
        String TypeName { 
get
set
; }
14 
    }
15 
16 
}

3.有了接口,我们可以定义自己的Logger了,为了安全,我们可以定义一个空的Logger,虽然它什么都不做,但是我们还是想要定义它。企业级,就是要什么都想得到。下面这个Logger,用了等于没有用,有点像抽象类,不过他的确是一个具体类。

 1 
using
 System;
 2 
using
 wojilu;
 3 
 4 
namespace
 wojilu.Log {
 5 
 6 
    
///
 
<summary>
 7 
    
///
 使用 null 模式的日志工具
 8 
    
///
 
</summary>
 9 
    
internal
 
class
 NullLogger : ILog {
10 
11 
        
public
 
void
 Debug( String message ) {
12 
        }
13 
14 
        
public
 
void
 Info( String message ) {
15 
        }
16 
17 
        
public
 
void
 Warn( String message ) {
18 
        }
19 
20 
        
public
 
void
 Error( String message ) {
21 
        }
22 
23 
        
public
 
void
 Fatal( String message ) {
24 
        }
25 
26 
27 
        
public
 String TypeName {
28 
            
set
 { }
29 
        }
30 
31 
    }
32 
}

 稍微正常一点的LOGGER,向文件系统写日志

    
///
 
<summary>
    
///
 文件日志工具,所有日志会被写入磁盘
    
///
 
</summary>
    
internal
 
class
 FileLogger : ILog {
        
private
 LogLevel _levelSetting;
        
private
 LogMessage _msg;
        
public
 FileLogger() {
            _levelSetting 
=
 LogConfig.Instance.Level;
            _msg 
=
 
new
 LogMessage();
        }
        
public
 
void
 Debug( String message ) {
            _msg.LogTime 
=
 DateTime.Now;
            _msg.Message 
=
 message;
            _msg.LogLevel 
=
 
"
debug
"
;
            System.Diagnostics.Debug.Write( LoggerUtil.GetFormatMsg( _msg ) );
            
if
 (_levelSetting 
>=
 LogLevel.Debug) {
                LoggerUtil.WriteFile( _msg );
            }
        }
。。。
。。。
        
public
 String TypeName {
            
set
 {
                _msg.TypeName 
=
 value;
            }
        }

 当然,还可以向DB插入日志:

 1 
    
///
 
<summary>
 2 
    
///
 存储到数据库的日志(尚未实现,请勿使用)
 3 
    
///
 
</summary>
 4 
    
internal
 
class
 LoggerForDB : ILog {
 5 
 6 
        
private
 LogLevel _levelSetting;
 7 
        
private
 LogMsg _msg;
 8 
 9 
        
public
 LoggerForDB() {
10 
            _levelSetting 
=
 LogConfig.Instance.Level;
11 
            _msg 
=
 
new
 LogMsg();
12 
        }

 当然,如果可以的话,你还可以向你们家的电视机输入TVLogger。,或者是向打印机出LOG,PrinterLogger

4.不管怎么样,我们需要配置,日志也需要配置

我们要一个配置类

 1 
   
///
 
<summary>
 2 
    
///
 日志配置文件,默认配置文件在 /framework/config/log.config,日志文件在 /framework/log/log.txt 中
 3 
    
///
 
</summary>
 4 
    
public
 
class
 LogConfig {
 5 
 6 
        
///
 
<summary>
 7 
        
///
 日志配置信息(全局缓存)
 8 
        
///
 
<remarks>
 9 
        
///
 logLevel 的值(不区分大小写):none, debug, info, warn, error, fatal, all;
10 
        
///
 logFile 和 logProvider 通常不用填写
11 
        
///
 
</remarks>
12 
        
///
 
<example>
13 
        
///
 配置文件的格式(一行一条配置,键值之间用冒号分开)。
14 
        
///
 
<code>
15 
        
///
 logLevel : info
16 
        
///
 logFile : log/log.txt
17 
        
///
 logProvider : wojilu.Log.FileLogger
18 
        
///
 
</code>
19 
        
///
 
</example>
20 
        
///
 
</summary>
21 
        
public
 
static
 
readonly
 LogConfig Instance 
=
 
new
 LogConfig();
22 
23 
        
private
 LogConfig() {
24 
25 
            String absPath 
=
 getConfigAbsPath();
26 
27 
            
if
 (strUtil.IsNullOrEmpty( absPath )) {
28 
                loadDefault();
29 
                
return
;
30 
            }

 5.作为企业级的程序员,我们还需要管理者,不管怎么样,你要用日志系统,你必须要向管理者申请,不申请不能使用。现在都很流行factory,或者Assistent类,不管要什么,都通过工厂或者助手要。但是,很多系统其实工厂只是生产一种东西,只不过参数不一样。

 1 
    
///
 
<summary>
 2 
    
///
 日志管理对象,通常用于获取日志工具
 3 
    
///
 
</summary>
 4 
    
///
 
<example>
 5 
    
///
 一般在类的第一行定义
 6 
    
///
 
<code>
 7 
    
///
 private static readonly ILog logger = LogManager.GetLogger( typeof( ObjectBase ) );
 8 
    
///
 
</code>
 9 
    
///
 然后可以在其他方法中使用
10 
    
///
 
<code>
11 
    
///
 logger.Info( "your message" );
12 
    
///
 
</code>
13 
    
///
 
</example>
14 
    
public
 
class
 LogManager {
15 
        
16 
        
private
 LogManager() {
17 
        }
18 
19 
        
///
 
<summary>
20 
        
///
 获取一个日志工具
21 
        
///
 
</summary>
22 
        
///
 
<param name="type">
对象类型
</param>
23 
        
///
 
<returns>
返回日志工具
</returns>
24 
        
public
 
static
 ILog GetLogger( Type type ) {
25 
            
return
 GetLogger( type.FullName );
26 
        }
27 
28 
        
///
 
<summary>
29 
        
///
 获取一个日志工具
30 
        
///
 
</summary>
31 
        
///
 
<param name="typeName">
对象类型
</param>
32 
        
///
 
<returns>
返回日志工具
</returns>
33 
        
public
 
static
 ILog GetLogger( String typeName ) {
34 
            ILog log 
=
 getLogger();
35 
            log.TypeName 
=
 typeName;
36 
            
return
 log;
37 
        }

 6.我们还要Until,他可以帮我们处理一些不归任何类处理的功能,这里是最能发挥想象力的地方了。

 1 
    
///
 
<summary>
 2 
    
///
 日志处理工具
 3 
    
///
 
</summary>
 4 
    
public
 
class
 LoggerUtil {
 5 
 6 
        
private
 
static
 Object objLock 
=
 
new
 
object
();
 7 
 8 
        
///
 
<summary>
 9 
        
///
 sql 日志的前缀
10 
        
///
 
</summary>
11 
        
public
 
static
 
readonly
 String SqlPrefix 
=
 
"
sql=
"
;
12 
13 
        
///
 
<summary>
14 
        
///
 在 web 系统中,记录 sql 执行的次数
15 
        
///
 
</summary>
16 
        
public
 
static
 
void
 LogSqlCount() {
17 
18 
            
if
 (CurrentRequest.getItem( 
"
sqlcount
"
 ) 
==
 
null
) {
19 
                CurrentRequest.setItem( 
"
sqlcount
"
1
 );
20 
            }
21 
            
else
 {
22 
                CurrentRequest.setItem( 
"
sqlcount
"
, ((
int
)CurrentRequest.getItem( 
"
sqlcount
"
 )) 
+
 
1
 );
23 
            }

 这个就是企业级的日志系统。不管怎么样,麻雀虽小,五脏俱全。该有的都要有,即使只是做日志也要成规模。

 如果你感兴趣的话,wojilu的ORM系统也可以单独使用啊。。。。。还有IOC系统,缓存系统。。。。包罗万象,应有竟有。

重复发明的轮子,可以拼出一部车了。

 

转载于:https://www.cnblogs.com/TextEditor/archive/2011/06/21/2086219.html

你可能感兴趣的文章
WindowManager.LayoutParams 详解
查看>>
Android的Aidl安装方法
查看>>
Linux中rc的含义
查看>>
实现跨交换机VLAN间的通信
查看>>
Java基础之String,StringBuilder,StringBuffer
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
C++ 0X 新特性实例(比较常用的) (转)
查看>>
node生成自定义命令(yargs/commander)
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
BZOJ1997:[HNOI2010]PLANAR——题解
查看>>
HTML5新手入门指南
查看>>
opennebula 开发记录
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>
6、Web Service-拦截器
查看>>
Flask 源码流程,上下文管理
查看>>
Breaking parallel loops in .NET C# using the Stop method z
查看>>
修改故障转移群集心跳时间
查看>>