日志的设计

一、几个问题:

1、日志干嘛用?

2、日志怎么输出?

3、用啥组件或工具?

4、日志怎么设计?(正文 - 前面废话不想看可以直接看最后内容)

二、系统日志干嘛用?

就是记录用户操作的行为,方便安全审计等等啊。

所以,日志有

1、登录访问

2、操作日志(增删改)

3、异常日志

4、开发日志

(我写离题了,应该是开发日志的使用)

三、日志怎么输出?

 

1、利用IIS输出

启用日志和设置日志的路径:

(备注:IIS默认是开启日志和写到系统盘的指定目录下,曾经遇到不注意这个细节,日志把C盘写满,导致服务器应用程序无法使用的情况。所以IIS日志建议(1)设置固定大小;(2)指向其他盘符。)

2、写入数据库

访问日志和操作日志等

可以设计成:

(1)写入同一数据库

(2)写入专属日志数据库

3、文本输出

4、Debug.WriteLine输出

5、写入Windows的Log里面

6、Email和短信等第三方输出

四、用啥组件或工具?

log4net是著名的一个组建,我不会用,不展开。

我用SlowX.Log4Net(自己写的一个组件)

五、日志怎么设计

这里主要讲开发日志(列表形式)

1、日志分成四类

A.SQL日志

B.SQL异常日志

C.文本日志

D.文本异常日志

2、日志输出有两个口径

A.文本输出

B.Debug.WriteLine输出

3、日志输出方式设置:

A.全部输出

B.本地输出

C.关闭(不输出)

D.本地不输出

默认设置形式:

(1)Debug.WriteLine是关闭,开发模式下开启

(2)文本日志分两种情况,开发模式和运行模式

A.开发模式:全部输出

B.运行模式:SQL异常日志和文本异常日志全部输出;SQL日志和文本日志设置为本地输出或不输出。

4、日志的文本存储格式:

网站根目录下(根目录可以指定) \\日志目录\\201606\\20160621\\

(1)2016062115_ExceptionSQL.log:2016年06月21日15时的SQL异常日志

(2)2016062115_SQL.log:2016年06月21日15时的SQL日志

(3)2016062115_Text.log:2016年06月21日15时的文本日志

(4)2016062115_Exception.log:2016年06月21日15时的异常日志

见人见智,日志存放目录可以考虑放在网站根目录下面的指定目录,也可以放在外部目录。

(1)网站根目录下:网站打包和整体管理比较容易一点,也可以通过ftp或者浏览器等直接访问查看日志。(不然得自己配套写一个工具看日志)

(2)外部目录:可以防止别人通过盗链形式,爬取到你的日志内容。特别是SQL日志,让别人知道你的表结构。

5、日志输出的格式和内容

(见下面的文字)

[1、日志内容 - 2016-06-21 15:59:10] ==>:

[异常]ExecuteDataSet ==> server=win-jqms2k-bjzw02.xincache.cn;database=host5984619; uid=host5984619;

select

t.ID, t.UserId, t.TheName,

t.EmUserStatusValue, t.YWFW, t.DWXZ,

t.CLSJ, t.ZZDJ, t.Address,

t.Zip, t.Fax, t.FDDBR,

t.ZW, t.OfficeTel, t.Mobile,

t.Email, t.LXR, t.LXRZW,

t.LXROfficeTel, t.LXRMobile, t.LXREmail,

t.LXRQQ, t.DWJJ, t.SQBG,

t.QYFRYYZZSMJ, t.ZZZSSMJ, t.QYYJZMCLSMJ,

t.IsCurrent, t.AuditText, t.AuditUserId,

t.AuditUserName, t.AuditTime, t.CreateTime,

t.UpdateTime, t.EmLastUserStatusValue, t.LockTime

from UTB_GZGREEN_MEMBER_INFO t

where t.ID = 83 and (EmUserStatusValue=3 or (EmUserStatusValue=5 and EmLastUserStatusValue=3) )

@tp1 = 83

select

t.ID, t.UserId, t.TheName,

t.EmUserStatusValue, t.YWFW, t.DWXZ,

t.CLSJ, t.ZZDJ, t.Address,

t.Zip, t.Fax, t.FDDBR,

t.ZW, t.OfficeTel, t.Mobile,

t.Email, t.LXR, t.LXRZW,

t.LXROfficeTel, t.LXRMobile, t.LXREmail,

t.LXRQQ, t.DWJJ, t.SQBG,

t.QYFRYYZZSMJ, t.ZZZSSMJ, t.QYYJZMCLSMJ,

t.IsCurrent, t.AuditText, t.AuditUserId,

t.AuditUserName, t.AuditTime, t.CreateTime,

t.UpdateTime, t.EmLastUserStatusValue, t.LockTime

from UTB_GZGREEN_MEMBER_INFO t

where t.ID = @tp1 and (EmUserStatusValue=3 or (EmUserStatusValue=5 and EmLastUserStatusValue=3) )

@tp1 83 Int64 Input SqlParameter

[执行时间]:00:00:00.0156250,开始时间:2016-6-21 15:59:09 ~ 结束时间:2016-6-21 15:59:09

在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

.Net SqlClient Data Provider

在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)

在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)

在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)

在 System.Data.SqlClient.TdsParserStateObject.WriteSni()

在 System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode)

在 System.Data.SqlClient.TdsParserStateObject.ExecuteFlush()

在 System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)

在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)

在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)

在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)

在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)

在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)

在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)

在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)

在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)

在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)

在 SlowX.DAL.Helpers.SqlHelper.ExecuteDataSetByList(IDbConnection connection, CommandType commandType, String SQL, List`1 commandParameters, String srcTable)

[URL]:http://www.gzgreen.com/memberinfo.aspx?id=83

[IP]:68.180.229.157

[客户端信息]:

操作系统:Unknown

浏览器:Mozilla

浏览器版本:0.0

客户端IP:68.180.229.157

cookies支持:True

VBScript:False

JavaScript:True

ActiveX:False

JavaApplets:False

语言:

框架支持:True

DOM:0.0

客户端Framework:0.0

[用户信息]:尚未登录

上面是SQL异常日志的输出内容有:

(1)时间:

(2)日志执行类型:上面例子是执行ExecuteDataSet发生异常

(3)数据库连接串:

A.有些系统会操作很多数据库,有很多数据库连接串,需要打印出来

B.数据库连接串不能打印密码,否者存在不安全风险,黑客盗链下载了日志后可以知道数据库连接串

(4)SQL语句内容:分成两段

A.转义了SQL参数的SQL语句,可以直接拷贝SQL语句到SQL查询面板运行和测试;

B.原始调用的SQL语句

(5)SQL的执行时间,返回记录数等(主要看SQL的运行性能)

(6)异常日志内容:打印异常的堆栈信息,方便定位发生错误的函数或方法

(7)发生异常的页面地址

(8)用户的IP(看哪个来源,有可能是黑客SQL测试注入造成的异常)

(9)客户端信息:打印客户端的信息。

之前开发遇到过一个问题,本地运行都ok,但客户使用老是报错,莫名其妙,频繁折腾于电话沟通。日志打印出来发现客户用的是IE6浏览器,对一个JavaScript脚本不支持,所以,显示客户端信息很有必要。

(10)用户信息:记录用哪个用户帐号登录和操作

6、暗黑小科技

第三方提醒:Email提醒或短信提醒。

(1)您写的系统保证100%没BUG?

(2)您会每天盯着日志看么?

(3)你会专门7×24小时派人专门运维和管理系统么?

往往都不会,所以。

系统要想无人值守,就需要::::::::

系统异常日志,做一个关键词过滤,一旦异常就通过Email或短信的方式提醒,可考虑,很必要。

SlowX.Log4Net

回头在介绍和分享。

时间: 2024-10-01 02:43:23

日志的设计的相关文章

日志表设计一例分析

关于关系表的设计归根结底有两个方面.第一,就是完全按照范式理论去设计,一般来说达到第三范式就可以了,或者你可以划分的更细到达更上一层次.比如第四,第五,第六等等.这种设计有自己的可读性很强,但是有一点,在检索数据的时候增加了多张关系表来做关联的开销.第二,就是在范式理论上适当的做些反范式,有的东西还是不要太剥离的好.(窄表以及宽表) 这点和软件设计中的紧耦合松耦合理论一致. 下面我就以常用的LOG表来做下演示,其中有两种表的实际,一种是窄表,一种是稍微宽一点的表.窄表:log_ytt mysql

线程安全的日志类设计

最近在写多线程方面的内容, 其实多线程开发设计清楚了在写, 并不会有太大的坑, 尽管如此, 难免有需要调试的时候, 多线程的程序单步调试有时候难以发现bug, 通过记录日志, 可以用来查找问题, 方便调试. 其实有不少开源的C++日志库, 比如大名鼎鼎的log4cxx, 轻量级的glog, 还有一些热心的同行提供的开源工程, 我大体看了几个, 觉得不是很符合我的胃口, 于是就花了一天的时间, 自己写了一个, 用起来还比较顺手, 想怎么改就怎么改, 目前还是比较适合需求的. 考虑到线程安全, 就有

日志系统之HBase日志存储设计优化

本人博客文章如未特别注明皆为原创!如有转载请注明出处:http://blog.csdn.net/yanghua_kobe/article/details/46482319 继续谈论最近接手的日志系统,上篇关于日志收集相关的内容,这篇我们谈谈日志存储相关的话题. 简介 我们首先来总结一下日志这种数据的业务特点:它几乎没有更新的需求,一个组件或一个系统通常有一个固定的日志格式,但就多个组件或系统而言它会存在各种五花八门的自定义的tag,这些tag建立的目的通常是为了后期查询/排查线上问题的需要,因此

【Go】类似csv的数据日志组件设计

原文链接:https://blog.thinkeridea.com/201907/go/csv_like_data_logs.html 我们业务每天需要记录大量的日志数据,且这些数据十分重要,它们是公司收入结算的主要依据,也是数据分析部门主要得数据源,针对这么重要的日志,且高频率的日志,我们需要一个高性能且安全的日志组件,能保证每行日志格式完整性,我们设计了一个类 csv 的日志拼接组件,它的代码在这里 datalog. 它是一个可以保证日志各列完整性且高效拼接字段的组件,支持任意列和行分隔符,

基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理

目录 1.RocketMQ DLedger 多副本日志复制流程图 1.1 RocketMQ DLedger 日志转发(append) 请求流程图 1.2 RocketMQ DLedger 日志仲裁流程图 1.3 RocketMQ DLedger 从节点日志复制流程图 2.RocketMQ DLedger 多副本日志复制实现要点 2.1 日志编号 2.2 追加与提交机制 2.3 日志一致性如何保证 上一篇 源码分析 RocketMQ DLedger(多副本) 之日志复制(传播) ,可能有不少读者朋

ASP.NET全栈开发日志模块之操作日志的设计

应用程序中的日志大致分为三种 第一种:用于生产模式下追中bug的异常日志.(这类日志相信大家都懂) 第二种:用于记录重要操作的行为日志.(这类日志主要作用是溯源,行为主要有三种:增.删.改) 第三种:用于记录历史浏览的消息日志.(这类日志主要记录用户的浏览痕迹) 消息日志和行为日志有点相似,都有溯源的作用,但它们区别很明显. 消息日志记录的是所有操作信息,比如 "gxqsd 登录了 系统 2018-7-27 23:46:10" , "gxqsd 访问了用户管理首页"

利用线程运行栈StackTraceElement设计Android日志模块

如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢? 1.引入Java的线程运行栈 Java.lang包中提供了StackTraceElement,可以用来获取方法的调用栈信息.通过调用线程函数Thread.currentThread().getStackTrace()可以获得StackTraceElement[]的堆栈数组,数组中保存了线程中的执行调用的方法.观察下面的代码: @Override pr

使用线程执行堆栈StackTraceElement设计Android日志模块

假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现? 1.介绍Java线程执行堆栈 Java.lang包中提供了StackTraceElement,能够用来获取方法的调用栈信息. 通过调用线程函数Thread.currentThread().getStackTrace()能够获得StackTraceElement[]的堆栈数组.数组中保存了线程中的运行调用的方法.观察以下的代码: @Override pr

日志库的设计思路

一.基本思路 日志库的设计,抓住最核心的一条,就是日志从产生到到达最终目的地期间的处理流程. 一般而言,为了设计一个灵活可扩展,可配置的日志库,可将日志库抽象为4个部分:记录器.过滤器.格式化器.输出器四部分. 记录器--负责产生日志记录的原始信息,比如(原始信息,日志等级,时间,记录的位置)等信息 过滤器--负责按指定的过滤条件过滤掉我们不需要的日志(比如按日志等级过滤) 格式化器--负责对原始日志信息按照我们想要的格式去格式化 输出器--负责将将要进行记录的日志(一般经过过滤器及格式化器的处