ASP.Net MVC 之如何写Log

ASP.Net MVC 之如何写Log

    日志(Log)对于一个程序的重要性不言而喻。操作系统的代码bootloader之后,就必须要实现串口打印log,因为你根本没有办法debug,这是早期移植Windows CE 5.0到6.0的经验,直到现在还是受用。集成开发环境,特别是Visual studio提供了强大的debug环境,特别是C#,Java等高级语言很容易发现NullReferenceException之类的异常,但对于C++等程序来说,没有Log简直没法做。其实对于线上环境来说,log还是很重要,因为你不可能很方便地重现环境。特别是对于facebook之类的公司,甚至利用log进行用户行为分析,这算是使用log的上乘了,我们先利用好log做好基本工作吧。

1.Log写在哪儿

      1. 函数入口写上Log,并且要把参数也写上(我认为是必须 )

      2. 异常处写上Log(我认为是必须)

      3. 计算特别复杂,没有把握的地方写上(视自己的情况而定 )

      下面有代码例子:

            public ActionResult Index(int Id)

        {

            _logger.DebugFormat(


Comment load single comment by commentId :{0}

, Id);
            
            

try

            {

                var comment 

=
 _commentService.Get(Id);
                

return
 FormatResult(comment); 
            }
            

catch
(Exception e)
            {

                _logger.Error(e.Message);
            }

            
return
 FormatResult(InCityErrorMessage.INCITY_COMMENT_LOAD_FAILED);
        }

      

2.正确使用Log的级别

      1. 函数入口处的Log和一般调试的Log使用debug级别,如上面的代码片段.

            _logger.DebugFormat(Comment load single comment by commentId :{0}, Id);

           

      2. 执行某项操作之后,使用info级别。例如支付成功,注册用户等。

      _logger.InfoFormat(Add order complete, orderId{0}, tradeNo:{1}, buyCount:{2}, unitPrice:{3}, orderDate:{4}, orderState:{5}, orderContract.Id, orderContract.TradeNo, orderContract.BuyCount, orderContract.Price, orderContract.OrderDate, orderContract.OrderStateText);        

      3. 异常处使用Error,或者明显出错的地方

          _logger.Error(e.Message);

      

      4. 发生严重地错误,导致破坏业务流程,例如短信发送或者订单处理,或者程序Crash.

public virtual bool Send(BaseSMSContract contract)

        {            

            
try

            {

                _logger.Debug(


In SMSService Send

);
                //…….


            }
            

catch
 (Exception e)
            {

                _logger.Fatal(e.Message);
            }

            
return 
false
;

        }          

 

3.根据级别不同使用将Log输出到文件,数据库

       能够利用现有的框架来写log那是非常方便了。我们项目中使用的是asp.net mvc框架,使用和Log4net很好地实现了log。

       下面介绍下具体的步骤: 

       

       1.下载Common.Logging,Common.Logging.Log4net,log4net三个dll, 并在项目中引用它们。

  ASP.Net MVC 之如何写Log 

ASP.Net MVC 之如何写Log 

       2.Web.config (App.config同理)需要两个地方配置,一个是在configSections中配置

  <sectionGroup name=”common”>

      

<
section 
name
=”logging”
 type
=”Common.Logging.ConfigurationSectionHandler, Common.Logging”
/>

    

</
sectionGroup
>

    <section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net”/>          

        

       3.另一个是配置common/logging和log4net. 

          


 <common>
    
<
logging
>

      

<
factoryAdapter 
type
=”Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net”
>

        

<
arg 
key
=”configType”
 value
=”INLINE”
/>

      

</
factoryAdapter
>

    

</
logging
>

  

</
common
>

  

<
log4net
>

    
    

<!–
输出到Visual studio输出窗口
–>

    

<
appender 
name
=”TraceAppender”
 type
=”log4net.Appender.TraceAppender”
>

      

<
layout 
type
=”log4net.Layout.PatternLayout”
>

        

<!–
格式
–>

        

<
conversionPattern 
value
=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline”
/>

      

</
layout
>

    

</
appender
>

    
    

<!–
输出到文件
–>

    

<
appender 
name
=”RollingFileAppender”
 type
=”log4net.Appender.RollingFileAppender”
>

      
<!–
文件名
–>

      

<
file 
value
=”incity_api.log”
/>

      
<!–
追加方式写
–>

      

<
appendToFile 
value
=”true”
/>

      

<
rollingStyle 
value
=”Size”
/>

      
<!–
每次写10个文件后覆盖
–>

      

<
maxSizeRollBackups 
value
=”10″
/>

      
<!–
每个文件做大500k
–>

      

<
maximumFileSize 
value
=”500KB”
/>

      

<
staticLogFileName 
value
=”true”
/>

      
<!–
格式
–>

      

<
layout 
type
=”log4net.Layout.PatternLayout”
>

        

<
conversionPattern 
value
=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline”
/>

      

</
layout
>

    

</
appender
>

    
<!–
Ado net数据库,需要建立表eventlog,字段是ID, log(varchar), createTime(datetime), level(int)
–>

    

<
appender 
name
=”AdoNetAppender”
 type
=”log4net.Appender.AdoNetAppender”
>

      
<!–
log到了512个字节才会输出到数据库 
–>

      

<
bufferSize 
value
=”512″
/>

      
      

<!–
只有级别在INFO上的才会写Log
–>

      

<
filter 
type
=”log4net.Filter.LevelRangeFilter”
>

        

<
param 
name
=”LevelMin”
 value
=”INFO”
/>

        

<
param 
name
=”LevelMax”
 value
=”FATAL”
/>

      

</
filter
>

      

<
connectionType 
value
=”System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089″
/>

      
<!–
数据库连接 
–>

      

<
connectionString 
value
=”server=.\SQLEXPRESS;database=incity;integrated security=false;persist security info=True;UID=sa;PWD=cry.cap.fox-999″
/>

      
<!–
执行的数据库命令 
–>

      

<
commandText 
value
=”INSERT INTO eventlog ([log],[createTime],[level]) VALUES (@log, @createTime, @level)”
/>

      
<!–
数据库参数 
–>

      

<
parameter
>

        

<
parameterName 
value
=”@createTime”
/>

        

<
dbType 
value
=”DateTime”
/>

        

<
layout 
type
=”log4net.Layout.RawTimeStampLayout”
/>

      

</
parameter
>

      
      

<
parameter
>

        

<
parameterName 
value
=”@log”
/>

        

<
dbType 
value
=”String”
/>

        

<
size 
value
=”1024″
/>

        

<
layout 
type
=”log4net.Layout.PatternLayout”
>

          

<
conversionPattern 
value
=”%message”
/>

        

</
layout
>

      

</
parameter
>

      
      

<
parameter
>

        

<
parameterName 
value
=”@level”
/>

        

<
dbType 
value
=”String”
/>

        

<
size 
value
=”50″
/>

        

<
layout 
type
=”log4net.Layout.PatternLayout”
>

          

<
conversionPattern 
value
=”%level”
/>

        

</
layout
>

      

</
parameter
>

    

</
appender
>

    
    

<
root
>

      

<
level 
value
=”DEBUG”
/>

      

<
appender-ref 
ref
=”TraceAppender”
/>

      

<
appender-ref 
ref
=”RollingFileAppender”
/>

      

<
appender-ref 
ref
=”AdoNetAppender”
/>

    

</
root
>

  

</
log4net
>

    

    上述的配置主要实现了下面的功能: 

 

  • log同时输出到了文件,数据库,Visual Studio输出(其实还可以有udp网络等等),主要都是靠 log4net不同的Appender实现。
  • log输出到文件的时候,是追加方式写,每个日志文件最大500k,写了10个后又从第一个开始覆盖
  • 只有info级别以上的log才会写到数据库中,不是每次写日志都会写数据库,只有到了512个字节才会flush到数据表eventlog中,eventlog需要自己先创建好,数据库会记录时间,级别,内容等信息。

 

 4.代码中使用

下面的代码片段讲述了如何使用log4net,OK,快去看看你的日志吧。

 

using Common.Logging;



namespace
 InCity.Restful.Controllers
{

    

public
 
class
 CommentController : BaseController
    {

        

private
 
readonly
 CommentService _commentService;
        

private
 
readonly
 UserService _userService;
        

private
 
readonly
 ILog _logger 
=
 LogManager.GetCurrentClassLogger();

        
public
 CommentController(CommentService commentService, 
                                 UserService userService)
        {

            _commentService 

=
 commentService;
            _userService 

=
 userService;
        }

        
public
 ActionResult Index(
int
 Id)
        {

            _logger.DebugFormat(


Comment load single comment by commentId :{0}

, Id);
            
            

try

            {

                var comment 

=
 _commentService.Get(Id);
                

return
 FormatResult(comment); 
            }
            

catch
(Exception e)
            {

                _logger.Debug(e.Message);
            }

            
return
 FormatResult(InCityErrorMessage.INCITY_COMMENT_LOAD_FAILED);

        }

 

转载于:https://www.cnblogs.com/enjoyeclipse/archive/2011/07/15/2106951.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110593.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • django3.0异步_定时任务框架

    django3.0异步_定时任务框架celery介绍Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。Celery侧重

    2022年7月31日
    4
  • PHP进销存erp源码库存管理系统

    PHP进销存erp源码库存管理系统PHP进销存erp源码库存管理系统(2次开发另外收费)本系统开发PHP+MySQL采用CI2.x框架本系统运行环境php5.3+mysql5.5支持IIS、apache不支持nginx源码网站:www.phprr.com演示地址:http://www.phprr.com/show-55账号:admin密码:jxc888888…

    2022年5月22日
    31
  • linux 通配符 排除,linux通配符「建议收藏」

    linux 通配符 排除,linux通配符「建议收藏」今天在看linux中有关Makefile文件的写法的时候,提到了通配符的概念。感觉似乎挺熟悉,但一时间竟想不起来到底为何物!经过在网上查询现总结如下:1、linux中基本通配符:“?”可替代单个字符。“*”可替代任意字符。方括号“[charset]”可替代charset集中的任何单个字符。对最后一条做些解释。[cChH]通配符便可替代c或h字符的大小写形式。通配符集还能描述介于字符对之间的所有字符…

    2022年9月19日
    0
  • .Net Core HttpClient处理响应压缩「建议收藏」

    .Net Core HttpClient处理响应压缩「建议收藏」前言在上篇文章[ASP.NETCore中的响应压缩]中我们谈到了在ASP.NETCore服务端处理关于响应压缩的请求,服务端的主要工作就是根据Content-Encoding头信息判断采用哪种方式压缩并返回。之前在群里有人问道过,现在的网络带宽这么高了还有必要在服务端针对请求进行压缩吗?确实,如今分布式和负载均衡技术这么成熟,很多需要处理高并发大数据的场景都可以通过增加服务器节点来进行。但是,在资源受限的情况下,或者是还没必要为了某一个点去增加新的服务器节点的时候,我们还是要采用一些程序本身的常规处理

    2022年7月15日
    14
  • 永久短网址生成 可以永久使用的短链接推荐

    永久短网址生成 可以永久使用的短链接推荐一、使用场景微博、短信、微信在推送信息的时候都有字符的数量限制,如果分享一个长网址,很容易就超出限制,发不出去。短网址服务可以把一个长网址变成短网址,方便在社交网络上传播。二、需求微信中链接过长容易被系统屏蔽,导致推送信息他人无法看到,或者是整个信息被收起来!短信、微博中字符数超级严格一旦超过了规定的字符数。就会导致信息发送失败!综上几个现在最长的场景,很显然,要尽可能的短…

    2022年5月31日
    252
  • 如何修改redis的端口号_redis配置文件详解

    如何修改redis的端口号_redis配置文件详解redis修改默认端口的方法是:首先要先下载文件并解压编译及安装,安装好后全局启动并且设置密码,然后再修改端口号,最后指定运行配置即可【推荐课程:redis教程】(1)通过下面的链接进行下载,然后再用以下命令进行,解压,编译,安装下载地址:http://download.redis.io/redis-stable.tar.gztarxzfredis-4.0.9.tar.gzcdredis-4…

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号