asp.net中的日志添加和未处理异常的记录
1.第一次写博客如有错误欢迎纠正。邮箱:Jiangwenyuan0217@163.com;
2.此博客可能对初学者有些帮助,对哪些骨灰级的程序员来说都是分分钟的事了,所以就不用在这里费时间了。
环境说明:
1.vs2010,sqlserver2008r2其实添加日志来说对一个程序的开发工具和数据库要求并不高。
我讲的日志有两种,一种是系统操作日志(添加到sqlserver数据库),另一种是程序未经处理异常日志(添加到用户配置的文件目录下)。
一、系统操作日志。
首先 创建数据库 ,日志表,存储过程
--创建数据库;
IF EXISTS(SELECT 'a' FROM sys.databases WHERE name='BoKeYuan')
BEGIN
DROP DATABASE BoKeYuan
END
go
CREATE DATABASE BoKeYuan
on
(
name ='BoKeYuan_data',
filename='e:\data\BoKeYuan.mdf'
)
log on
(
name='BoKeYuan_log',
filename='e:\data\BoKeYuan.ldf'
)
use BoKeYuan ---创建日志表;
IF EXISTS(SELECT 'a' FROM sys.objects WHERE name='Bas_SysLog' AND type='U')
BEGIN
DROP TABLE Bas_SysLog
END
go
CREATE TABLE [dbo].[Bas_SysLog](
[ID] [bigint] IDENTITY(1,1) NOT NULL,--id要用bigint因为日志表数据会超大;
[FMID] [int] NULL,--功能页面id
[FMName] [varchar](100) NULL,--功能名称
[PageName] [varchar](100) NULL,--页面名;路径
[OpTime] [datetime] DEFAULT GETDATE() NOT NULL,--时间
[UserID] [int] NULL, --用户id
[OpUser] [varchar](50) NOT NULL,--操作用户名;
[OpType] [varchar](20) NULL,--操作结果枚举;
[OpScp] [varchar](20) NULL,--操作描述枚举
[OpCtt] [varchar](max) NULL--操作内容可记录错误;
) GO --创建查询日志的存储过程 IF EXISTS(SELECT 'a' FROM sys.objects WHERE name='Base_GetSysLog' AND type='P')
BEGIN
DROP PROCEDURE Base_GetSysLog
END
GO
CREATE PROCEDURE Base_GetSysLog
@FMID INT,
@FMName VARCHAR(200),
@PageName VARCHAR(200),
@UserID INT,
@OpUser VARCHAR(20),
@OpType VARCHAR(20),
@OpScp VARCHAR(20),
@OpCtt VARCHAR(max)
AS
INSERT INTO Bas_SysLog(FMID,FMName,PageName,UserID,OpUser,OpType,OpScp,OpCtt)
VALUES(@FMID,@FMName,@PageName,@UserID,@OpUser,@OpType,@OpScp,@OpCtt) go
然后创建一个webForm页面
像其中拖入两个控件如下;
<div>
<asp:Button ID="addLog" runat="server" Text="添加系统日志" onclick="addLog_Click" />
</div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
转到后台cs文件中写如下代码.
using System.Data;
using System.Data.SqlClient; /// <summary>
/// 记录操作结果
/// </summary>
public enum ELogResult
{
成功,
失败,
未知,
}
/// <summary>
/// 记录日志操作类型
/// </summary>
public enum ELogType
{
登录,
注销,
添加,
修改,
删除,
查询,
导出,
导入,
} protected void addLog_Click(object sender, EventArgs e)
{
string conString = "Data Source=.;database=BoKeYuan;user id=sa;password=sqldba;";
SqlConnection sqlcon = new SqlConnection(conString);
SqlCommand sqlcom = sqlcon.CreateCommand();
sqlcom.CommandType = CommandType.StoredProcedure;
SqlParameter[] sps ={
new SqlParameter("@FMID",),
new SqlParameter("@FMName","测试添加日志功能"),
new SqlParameter("@PageName","AddSysLog.aspx"),
new SqlParameter("@UserID",),
new SqlParameter("@OpUser","圣叹"),
new SqlParameter("@OpType",ELogResult.成功.ToString()),
new SqlParameter("@OpScp",ELogType.添加.ToString()),
new SqlParameter("@OpCtt","添加一条日志成功了")
};
sqlcom.Parameters.AddRange(sps);
sqlcom.CommandText = "Base_GetSysLog";
try
{
sqlcon.Open();
sqlcom.ExecuteNonQuery();
}
catch (Exception error)
{
if (sqlcon.State == ConnectionState.Open)
{
sqlcon.Close();
}
}
finally
{
if (sqlcon.State == ConnectionState.Open)
{
sqlcon.Close();
}
sqlcon.Dispose();
}
BindSysLog();
} private void BindSysLog()
{
string conString = "Data Source=.;database=BoKeYuan;user id=sa;password=sqldba;";
SqlConnection sqlcon = new SqlConnection(conString);
SqlCommand sqlcom = sqlcon.CreateCommand();
sqlcom.CommandType = CommandType.Text;
sqlcom.CommandText = "select * from Bas_SysLog";
SqlDataAdapter sqladapter = new SqlDataAdapter(sqlcom);
DataSet ds = null;
try
{
ds = new DataSet();
sqlcon.Open();
sqladapter.Fill(ds);
}
catch (Exception e)
{
if (sqlcon.State == ConnectionState.Open)
{
sqlcon.Close();
}
}
finally
{
if (sqlcon.State == ConnectionState.Open)
{
sqlcon.Close();
}
sqlcon.Dispose();
}
if (ds != null)
{
GridView1.DataSource = ds;
GridView1.DataBind();
}
ds.Dispose(); }
一般我们会将添加日志的方法放在网站页面的父类BasePage中方便用户直接在页面中调用,而且还可以直接获取用户的UserID,Name,FMID,FMNAME等参数
更简单易用,达到方便添加日志的目的。当然示例中直接写了ADO.Net的数据库操作这也是不合理的,应该封装到DBUtility下的SqlHelper类文件中方便统一管理,
但是此处不是重点所以我就写在了一起。
二、添加未处理异常日志,文件系统
网站在设计时一般会设置未处理异常的日志添加功能,记录可能发生数据库网络连接中断或数据库表死锁或程序出现未处理异常时的日志。
首先在网站配置文件中添加一个日志记录文件的根文件目录的配置节如下:
<appSettings>
<!--系统文档路径
请将本系统的所有目录都放在此目录的子目录下,并记录在此处。
1.SysLog:保存系统运行和系统停止及系统错误日志文件夹;位置Common类库CTryCatch类;
-->
<add key="DocPath" value="D:\Doc\FilePath\"/>
</appSettings>
我把记录日志的cs代码放到新类库Common的CSysLog类中如下:
namespace Common
{
public class CSysLog
{
/// <summary>
/// 添加系统日志的方法(开启,关闭,未处理异常等。)
/// 以文本文件形式保存在文件目录的“SysLog”文件下;
/// </summary>
/// <param name="fileName">添加日志的文件类型【启动或关闭系统:StartOrEnd;错误日志:Error;其他:Other】等等</param>
/// <param name="dataLog">日志内容</param>
public void AddLog(string fileName, string dataLog)
{
string logPath = System.Configuration.ConfigurationManager.AppSettings["DocPath"]; string tempPath = logPath + @"SysLog\";
if (!Directory.Exists(tempPath))//创建文件夹;
{
Directory.CreateDirectory(tempPath);
} if (fileName.Equals("StartOrEnd"))//如果是启动
{
tempPath = tempPath + @"StartOrEnd\";
if (!Directory.Exists(tempPath))//创建文件夹;
{
Directory.CreateDirectory(tempPath);
}
}
else if (fileName.Equals("Error"))//如果是错误日志
{
tempPath = tempPath + @"Error\";
if (!Directory.Exists(tempPath))//创建文件夹;
{
Directory.CreateDirectory(tempPath);
}
tempPath = tempPath + DateTime.Now.ToString("yyyy_MM") + @"\";
if (!Directory.Exists(tempPath))//创建文件夹;
{
Directory.CreateDirectory(tempPath);
}
}
else//如果是其他的就创建;文件夹;
{
tempPath = tempPath + fileName + @"\";
if (!Directory.Exists(tempPath))//创建文件夹;
{
Directory.CreateDirectory(tempPath);
}
}
string filePath = tempPath + fileName + DateTime.Now.ToString("_yyyy-MM-dd") + @".txt";//文件完全路径; FileStream fs = new FileStream(filePath, FileMode.Append);
StreamWriter writer = new StreamWriter(fs);
writer.WriteLine(dataLog);
writer.Close();
fs.Close();
}
}
}
然后就需要添加日志记录了,在网站中新建一个全局应用程序文件Global。
其中代码如下:
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
Common.CSysLog csl = new Common.CSysLog();
string log = "应用程序在【" + DateTime.Now.ToString() + "】启动!\r\n";
csl.AddLog("StartOrEnd", log);
} void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
Common.CSysLog csl = new Common.CSysLog();
string log = "应用程序在【" + DateTime.Now.ToString() + "】停止!\r\n";
csl.AddLog("StartOrEnd", log);
} void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
Common.CSysLog csl = new Common.CSysLog();
Exception ex = Server.GetLastError().GetBaseException();
System.Text.StringBuilder builder = new StringBuilder();
builder.Append("=======================================错误信息===============================================\r\n");
builder.AppendFormat("错误消息:{0}\r\n", ex.Message);
builder.AppendFormat("错误页面:{0}\r\n", Request.Url);
builder.AppendFormat("错误时间:{0}\r\n", DateTime.Now.ToString());
builder.AppendFormat("堆栈跟踪:{0}\r\n", ex.StackTrace);
builder.Append("--------------------------其他信息------------------------------\r\n");
builder.AppendFormat("错误程序:{0}\r\n", ex.Source);
builder.AppendFormat("目标地点:{0}\r\n", ex.TargetSite);
builder.AppendFormat("主机IP:{0}\r\n", Request.UserHostAddress);
builder.AppendFormat("主机名称:{0}\r\n", Request.UserHostName);
builder.AppendFormat("请求类型:{0}\r\n", Request.HttpMethod);
builder.AppendFormat("参数列表:{0}\r\n", Request.QueryString);
builder.AppendFormat("提交表单:{0}\r\n", Request.Form.ToString()); csl.AddLog("Error", builder.ToString());
}
这样在系统出现未处理异常时则会在你配置的文件目录中出现一条错误记录,根据记录内容就可直接找到错误了,
在系统首次运行和停止时都会在日志中添加日志方便查看系统关闭和启动的时间,
记录如下
在此把一些小东西分享给大家写的不好请大家谅解。欢迎交流。2014-01-17
asp.net中的日志添加和未处理异常的记录的更多相关文章
- asp.net 中给gridview添加自动序号
第一种方式,直接在Aspx页面GridView模板列中.这种的缺点是到第二页分页时又重新开始了. 代码如下: <asp:TemplateField HeaderText="序号&quo ...
- Hive中的日志
Hive中的日志分为两种1. 系统日志,记录了hive的运行情况,错误状况.2. Job 日志,记录了Hive 中job的执行的历史过程. 1.系统日志 系统日志存储在什么地方呢 ?在hive/con ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- (14)ASP.NET Core 中的日志记录
1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ...
- [转]asp.net5中使用NLog进行日志记录
本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...
- asp.net5中使用NLog进行日志记录
asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...
- asp.net中的ListBox控件添加双击事件
问题:在Aspx页里的ListBox A中添加双击事件,将选中项添加到另一个ListBox B中,双击ListBox B中的选中项,删除当前选中项 页面: <asp:ListBox ID=&qu ...
- asp.net中一般处理程序中添加session
asp.net中使用一般处理程序(.ashx)添加session,利用context.session["xxx"] = value的方式把值保存到session:运行的时候会出现该 ...
- asp.net中生成缩略图并添加版权实例代码
这篇文章介绍了asp.net中生成缩略图并添加版权实例代码,有需要的朋友可以参考一下 复制代码代码如下: //定义image类的对象 Drawing.Image image,newimage; //图 ...
随机推荐
- Python钉钉报警及Zabbix集成钉钉报警
钉钉报警设置 创建群机器人 11111 接口地址 发送短消息 发送普通消息 import requests import json url = 'https://oapi.dingtalk.com/r ...
- iNeuOS工业互联平台,WEB组态(iNeuView)集成图报组件,满足实时数据图形化展示的需求
目 录 1. 概述... 1 2. 平台演示... 2 3. 应用过程... 3 4. 实时数据展示效果... 5 1. 概述 市场和开源社区有 ...
- SpringMVC+Spring+mybatis+maven+搭建多模块框架前后端分离开发框架的完整demo,拿走不谢。——猿实战02
猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...
- python基础 Day3
python Day3 1.作业回顾 设定一个理想的数字比如88,让用户输入数字,如果比88大,则显示猜测的结果大:如果比66小,则显示猜测的结果小了,给用户三次猜测机会,如果显示猜测正确退出循环,如 ...
- go thrift demo
接口:https://gowalker.org/github.com/apache/thrift/lib/go/thrift 参考文件:https://cong.im/2018/05/14/other ...
- 如何处理遇到的错误-lammps
一.认清模型——data文件: 二.读懂in文件: 三.当遇到error时,we can do: 1.查错: (1)从out文件中,复制里边的错误信息(copy一部分,不用全部): (2)进入到lam ...
- laravel中elastisearch安装和测试运行是否成功(注意是windows下的操作)
1.去elasticsearch官网下载,如果太慢可以在我上一个随笔看下载地址 2.下载完解压缩,在cmd中找到到elasticsearch的bin目录下执行.\elasticsearch.bat - ...
- composer分析(二)结合PSR-4
composer分析(二)结合PSR-4 PSR-4提供了一种文件和路径映射关系,非常类似文件系统的组织结构 全限定类名 \<NamespaceName>(\<SubNamespac ...
- C# 压缩、解压文件夹或文件(带密码)
今天梳理一下项目中用到的压缩.解压文件夹或文件的方法,发现因为需求不同,已经用了好几个不同组件.今天就好好整理记录下,别下次遇到需求又重头开始了. DotNetZip DotNetZip是一个开源的免 ...
- php验证当前是设备是电脑端还是手机端
<?php // 验证设备为PC还是WAP $agent = $_SERVER['HTTP_USER_AGENT']; if(strpos($agent,"comFront" ...