加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

一步步开发自己的博客 番外篇(7、异步记录日志 和 文章阅读量统

发布时间:2020-12-15 21:25:03 所属栏目:asp.Net 来源:网络整理
导读:h1 id="autoid-0-0"前言? 离前一篇《》都个把月了。 当时写完第六篇,很多人问“剧终”了?你还有好多实现没有讲解分析呢。我说没呢,后期还会有第二版、第三版...至于还没有分析到,后期补上。你看,我今天不就来了么。 前段时间写代码,手都写的酸痛酸痛的

<h1 id="autoid-0-0">前言?

离前一篇《》都个把月了。

当时写完第六篇,很多人问“剧终”了?你还有好多实现没有讲解分析呢。我说没呢,后期还会有第二版、第三版...至于还没有分析到,后期补上。你看,我今天不就来了么。

前段时间写代码,手都写的酸痛酸痛的,歇息了几天,好多了。然后,又捣鼓了一下webapi。这也是个没有接触过的知识。跌跌撞撞的整了点东西出来。有兴趣写移动端的同学可以联系我,大家一起学习。API文档和测试地址:?

其他的就不多说了,进入今天的主题,异步记录日志和文章阅读量统计。

异步记录日志

我们常用日志记录,无非就是,数据库记录和文本日志记录。而今天我要说的是,文本日志记录。

最简单的文本记录:??使用静态类File的WriteAllText 如果文件存在则覆盖,传入文件路径和消息内容。ok,完事。

当然,我们不能每次都覆盖上一次的记录。??那么我们可是在原有内容追加。这里,我们不用关系文件流是否关闭,使用静态类File的这两个方法都会自动帮我们关闭。

如果,我们是使用的winfrom单线程。那么,基本的日志记录就这个两个方法 完全可以搞定。

但是,如果是web程序就不一样了,天生的多线程。多个线程同时访问一个文件,肯定是会报错的。不信你试试。

那我们怎么解决这个问题?有人会说,加锁呗。锁肯定是要加,不过要看怎么加了。如果加到写文件内容的时候肯定是不合适的。因为写文件要打开文件流,比较耗时。我们可以先把要写的日志,统一存内存,然后单线程从内存取数据,写到文本。当然,写内存也可能会多线程并发,这个时候,我们就可以把锁加到写内存的地方。这里大家就不用担心了,写内存的速度是非常快的,和直接写文件那差的可不是一两个档次的问题了。

我们刚才说存内存,怎么存?当然是存集合了。有个数据类型??为什么要用它。因为它是队列,有个特点:先进先出。我们取数据的时候就是去的最早存进去的数据了。

使用:存数据? Queue(); myQ.Enqueue();? ?取数据? t = myQ.Dequeue();?直接在取值的时候就把值在队列中移除了。这样正好免了我手动移除。

那么,很简单。我们记日志的时候就先把日志往??里存,然后单独开个进程取值存值写文件里。ok,完事。

刚才说了,我们要加锁。是的,要加锁。因为??并不是线程安全数据。我们在写数据和读数据的时候都要加锁。

myLock= m = logQueue.Dequeue();

我之前在网上查资料说不能多线程同时写入队列,经测试其实是不能同时读和写队列。所以在Dequeue取的时候也要锁定同一个对象

思路大体就是这样了。当然,我们还可以扩展很多的东西。如:定时删除指定过期日志、分文件大小存储日志、自动增加的日志文件命名...等等。

没错,我确实是在造轮子。我不想解释太多了。累... ? 大神请略过....

下面给出,我的具体实现代码。分为四个文件??包含文件名、日志内容??存队列、写文件??读取相关配置??外部直接调用

<span style="color: #0000ff;">namespace<span style="color: #000000;"> CommonLib.HiLog
{
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 日志模型
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #0000ff;">internal
<span style="color: #0000ff;">class
<span style="color: #000000;"> LogModel
{
<span style="color: #0000ff;">#region
logFileName
<span style="color: #0000ff;">private
<span style="color: #0000ff;">string
<span style="color: #000000;"> _logFileName;

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 日志文件名字
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; logFileName
    {
        </span><span style="color: #0000ff;"&gt;get</span> { <span style="color: #0000ff;"&gt;return</span> _logFileName + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;_</span><span style="color: #800000;"&gt;"</span> + DateTime.Now.ToString(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;yyyyMMdd</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;); }
        </span><span style="color: #0000ff;"&gt;set</span> { _logFileName =<span style="color: #000000;"&gt; value; }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> logMessg
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; _logMessg;

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 日志内容
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; logMessg
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;----begin-------</span><span style="color: #800000;"&gt;"</span> + DateTime.Now.ToString() + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;----Queue.Count:</span><span style="color: #800000;"&gt;"</span> + LogHelper.LogQueue.Count + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;-----------------------------------rnrn</span><span style="color: #800000;"&gt;"</span>
                +<span style="color: #000000;"&gt; _logMessg
                </span>+ <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rnrn----end----------</span><span style="color: #800000;"&gt;"</span> + DateTime.Now.ToString() + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;----Queue.Count:</span><span style="color: #800000;"&gt;"</span> + LogHelper.LogQueue.Count + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;-----------------------------------</span><span style="color: #800000;"&gt;"</span>
                + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rnrnrn</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;
        }
        </span><span style="color: #0000ff;"&gt;set</span> { _logMessg =<span style="color: #000000;"&gt; value; }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span><span style="color: #000000;"&gt;
}

}

<span style="color: #0000ff;">namespace<span style="color: #000000;"> CommonLib.HiLog
{
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 日志操作辅助类
<span style="color: #808080;">///<span style="color: #008000;"> zhaopeiym@163.com
<span style="color: #808080;">///<span style="color: #008000;"> 创建20150104 修改20151003
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #0000ff;">internal
<span style="color: #0000ff;">class
<span style="color: #000000;"> LogHelper
{
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 消息队列
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #0000ff;">private
<span style="color: #0000ff;">static
Queue logQueue = <span style="color: #0000ff;">new
Queue<span style="color: #000000;">();
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 消息队列 对外只读
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #0000ff;">public <span style="color: #0000ff;">static Queue<span style="color: #000000;"> LogQueue
{
<span style="color: #0000ff;">get { <span style="color: #0000ff;">return<span style="color: #000000;"> LogHelper.logQueue; }
}

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 标志锁
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;string</span> myLock = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;true</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 写入日志文件(异步单线程 记录日志)
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="logmede"&gt;</param></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; logWrite(LogModel logmede)
    {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 这里需要锁上 不然会出现:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。异常   
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;网上有资料说 </span><span style="color: #008000; text-decoration: underline;"&gt;http://blog.csdn.net/greatbody/article/details/26135057</span><span style="color: #008000;"&gt;  不能多线程同时写入队列
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;其实  不仅仅 不能同时写入队列 也不能同时读和写如队列  所以  在Dequeue 取的时候也要锁定一个对象</span>
        <span style="color: #0000ff;"&gt;lock</span><span style="color: #000000;"&gt; (myLock)
            logQueue.Enqueue(logmede);
        logStartWrite();
    }

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 文件编码格式
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> Encoding encoding =<span style="color: #000000;"&gt; Encoding.Default;

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 是否开始自动记录日志
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;bool</span> isStart = <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 用来 标识 最好一次 检测是否 需要 清理 日志文件 时间
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> DateTime time =<span style="color: #000000;"&gt; DateTime.MinValue;
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 每个日志文件夹 对应的文件下标
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> Dictionary<<span style="color: #0000ff;"&gt;string</span>,<span style="color: #0000ff;"&gt;int</span>> logFileNum = <span style="color: #0000ff;"&gt;new</span> Dictionary<<span style="color: #0000ff;"&gt;string</span>,<span style="color: #0000ff;"&gt;int</span>><span style="color: #000000;"&gt;();
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 开始把队列消息写入文件
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; logStartWrite()
    {
        </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (isStart)
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt;;
        isStart </span>= <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
        Task.Run(() </span>=><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;while</span> (<span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;)
            {
                </span><span style="color: #0000ff;"&gt;if</span> (LogHelper.logQueue.Count >= <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;)
                {
                    LogModel m </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
                    </span><span style="color: #0000ff;"&gt;lock</span><span style="color: #000000;"&gt; (myLock)
                        m </span>=<span style="color: #000000;"&gt; LogHelper.logQueue.Dequeue();
                    </span><span style="color: #0000ff;"&gt;if</span> (m == <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
                        </span><span style="color: #0000ff;"&gt;continue</span><span style="color: #000000;"&gt;;

                    </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(LogConfig.logFilePath))
                        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span> Exception(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;请先初始化日志保存路径LogModel._logFilePath</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);

                    TestingInvalid();

                    </span><span style="color: #0000ff;"&gt;if</span> (!Directory.Exists(LogConfig.logFilePath + m.logFileName + <span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;&;/span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;))
                        Directory.CreateDirectory(LogConfig.logFilePath </span>+ m.logFileName + <span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;&;/span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);

                    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; int i = m.logFileNum;</span>
                    <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;logFileNum.Keys.Contains(m.logFileName))
                        logFileNum.Add(m.logFileName,</span><span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;);
                    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;部分 日志 文件路径</span>
                    <span style="color: #0000ff;"&gt;string</span> SectionfileFullName = LogConfig.logFilePath + m.logFileName + <span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;&;/span><span style="color: #800000;"&gt;"</span> + m.logFileName + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;_</span><span style="color: #800000;"&gt;"</span> + logFileNum[m.logFileName].ToString(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;000</span><span style="color: #800000;"&gt;"</span>) + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;.txt</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;
                    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;最新的写了内容的 部分 日志文件路径</span>
                    <span style="color: #0000ff;"&gt;string</span> TopSectionfileFullName =<span style="color: #000000;"&gt; SectionfileFullName;
                    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 需要实时更新的 最新日志文件 路径</span>
                    <span style="color: #0000ff;"&gt;string</span> LogfileFullNqme = LogConfig.logFilePath + m.logFileName + <span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;&;/span><span style="color: #800000;"&gt;"</span> + m.logFileName + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;.txt</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;

                    FileInfo file </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; FileInfo(SectionfileFullName);
                    </span><span style="color: #0000ff;"&gt;while</span> (file.Exists &amp;&amp; file.Length >=<span style="color: #000000;"&gt; LogConfig.SectionlogFileSize)
                    {
                        TopSectionfileFullName </span>=<span style="color: #000000;"&gt; SectionfileFullName;
                        logFileNum[m.logFileName]</span>++<span style="color: #000000;"&gt;;
                        SectionfileFullName </span>= LogConfig.logFilePath + m.logFileName + <span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;&;/span><span style="color: #800000;"&gt;"</span> + m.logFileName + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;_</span><span style="color: #800000;"&gt;"</span> + logFileNum[m.logFileName].ToString(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;000</span><span style="color: #800000;"&gt;"</span>) + <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;.txt</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;
                        file </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; FileInfo(SectionfileFullName);
                    }

                    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;
                    {
                        </span><span style="color: #0000ff;"&gt;if</span> (!file.Exists)<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;如果不存在 这个文件 就说明需要 创建新的部分日志文件了</span>

<span style="color: #000000;"> {
<span style="color: #008000;">//<span style="color: #008000;">因为SectionfileFullName路径的文件不存在 所以创建
<span style="color: #000000;"> File.WriteAllText(SectionfileFullName,m.logMessg,encoding);

                            FileInfo Logfile </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; FileInfo(LogfileFullNqme);
                            </span><span style="color: #0000ff;"&gt;if</span> (Logfile.Exists &amp;&amp; Logfile.Length >=<span style="color: #000000;"&gt; LogConfig.FileSize)
                                </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;先清空  然后加上 上一个部分文件的内容</span>
                                File.WriteAllText(LogfileFullNqme,File.ReadAllText(TopSectionfileFullName,encoding),encoding);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;如果存在则覆盖                           </span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">else<span style="color: #000000;">
File.AppendAllText(SectionfileFullName,encoding);<span style="color: #008000;">//<span style="color: #008000;">累加

                        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;追加这次内容 到动态更新的日志文件</span>

<span style="color: #000000;"> File.AppendAllText(LogfileFullNqme,encoding);
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception ex)
{
<span style="color: #0000ff;">throw<span style="color: #000000;"> ex;
}

                }
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
                {
                    isStart </span>= <span style="color: #0000ff;"&gt;false</span>;<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;标记下次可执行</span>
                    <span style="color: #0000ff;"&gt;break</span>;<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;跳出循环</span>

<span style="color: #000000;"> }
}
});
}

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 检测 并删除 之前之外的 日志文件
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; TestingInvalid()
    {
        </span><span style="color: #0000ff;"&gt;#region</span> 检测 并删除 之前之外的 日志文件
        <span style="color: #0000ff;"&gt;if</span> (time.AddMinutes(LogConfig.TestingInterval) <= DateTime.Now)<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 时间内 检测一次</span>

<span style="color: #000000;"> {
<span style="color: #0000ff;">try<span style="color: #000000;">
{
time =<span style="color: #000000;"> DateTime.Now;
List<<span style="color: #0000ff;">string> keyNames = <span style="color: #0000ff;">new List<<span style="color: #0000ff;">string><span style="color: #000000;">();
<span style="color: #0000ff;">foreach (<span style="color: #0000ff;">var logFileName <span style="color: #0000ff;">in<span style="color: #000000;"> logFileNum.Keys)
{
CreatePath(LogConfig.logFilePath + logFileName + <span style="color: #800000;">@"<span style="color: #800000;"><span style="color: #800000;">"<span style="color: #000000;">);
DirectoryInfo dir = <span style="color: #0000ff;">new DirectoryInfo(LogConfig.logFilePath + logFileName + <span style="color: #800000;">@"<span style="color: #800000;"><span style="color: #800000;">"<span style="color: #000000;">);
<span style="color: #0000ff;">if (dir.CreationTime.AddMinutes(LogConfig.DelInterval) <= DateTime.Now)<span style="color: #008000;">//<span style="color: #008000;">删除 设定时间 之前的日志
<span style="color: #0000ff;">foreach (<span style="color: #0000ff;">var fileInfo <span style="color: #0000ff;">in<span style="color: #000000;"> dir.GetFiles())
{
<span style="color: #0000ff;">if (fileInfo.LastWriteTime.AddMinutes(LogConfig.DelInterval) <= DateTime.Now)<span style="color: #008000;">//<span style="color: #008000;">最后修改时间算起
<span style="color: #000000;"> File.Delete(fileInfo.FullName);

                        }
                    </span><span style="color: #0000ff;"&gt;if</span> (dir.GetFiles().Length == <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
                        keyNames.Add(logFileName);</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;临时存储没有日志文件的文件夹</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">foreach (<span style="color: #0000ff;">var key <span style="color: #0000ff;">in keyNames)<span style="color: #008000;">//<span style="color: #008000;">删除没有日志文件的文件夹
<span style="color: #000000;"> {
logFileNum.Remove(key);
Directory.Delete(LogConfig.logFilePath + key + <span style="color: #800000;">@"<span style="color: #800000;"><span style="color: #800000;">",<span style="color: #0000ff;">false<span style="color: #000000;">);
}
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception ex)
{
LogSave.ErrLogSave(<span style="color: #800000;">"<span style="color: #800000;">手动捕获[检测并删除日志出错!]<span style="color: #800000;">",ex,<span style="color: #800000;">"<span style="color: #800000;">记录日志出错<span style="color: #800000;">"<span style="color: #000000;">);
}
}
<span style="color: #0000ff;">#endregion<span style="color: #000000;">
}

    </span><span style="color: #0000ff;"&gt;#region</span>  创建路径
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 创建路径
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="paht"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;bool</span> CreatePath(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; paht)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;Directory.Exists(paht))
        {
            Directory.CreateDirectory(paht);
            </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
        }
        </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span><span style="color: #000000;"&gt;
}

}

<span style="color: #0000ff;">namespace<span style="color: #000000;"> CommonLib.HiLog
{
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 日志相关配置
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #0000ff;">public
<span style="color: #0000ff;">static
<span style="color: #0000ff;">class
<span style="color: #000000;"> LogConfig
{
<span style="color: #0000ff;">#region
辅助方法
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> GetAppSettings
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #808080;">///
<span style="color: #808080;"><param name="key">

<span style="color: #808080;">///
<span style="color: #808080;">

<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">string GetAppSettings(<span style="color: #0000ff;">string<span style="color: #000000;"> key)
{
<span style="color: #0000ff;">if<span style="color: #000000;"> (ConfigurationManager.AppSettings.AllKeys.Contains(key))
<span style="color: #0000ff;">return<span style="color: #000000;"> ConfigurationManager.AppSettings[key].ToString();
<span style="color: #0000ff;">return <span style="color: #0000ff;">string<span style="color: #000000;">.Empty;
}

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 计算字符串 转 计算结果
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="v"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<returns></returns></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;string</span> toCompute(<span style="color: #0000ff;"&gt;this</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; v)
    {
        </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;new</span> DataTable().Compute(v,<span style="color: #800000;"&gt;""</span><span style="color: #000000;"&gt;).ToString();
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 静态属性和字段

    <span style="color: #0000ff;"&gt;#region</span> logFilePath 路径
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 日志要存的路径 默认路径:网站根目录 + Log 文件夹
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 在程序第一次启动是设置
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>       
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; _logFilePath;

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 日志要存的路径 默认路径:网站根目录 + Log 文件夹
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 在程序第一次启动是设置
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>   
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; logFilePath
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(_logFilePath))
            {
                </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;
                {
                    _logFilePath </span>= HttpContext.Current.Server.MapPath(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;~/</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
                }
                </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception)
                {
                    </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;
                    {
                        _logFilePath </span>= System.Windows.Forms.Application.StartupPath + <span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;&;/span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;;
                    }
                    </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception)
                    {
                        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span> Exception(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;请先初始化要保存的路径:LogModel._logFilePath</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
                    }
                }
            }
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _logFilePath;
        }

        </span><span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;
        {
            _logFilePath </span>=<span style="color: #000000;"&gt; value;
        }
    }

    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 检测间隔时间(分钟)
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; _TestingInterval;
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 检测间隔时间(分钟) 默认:一天
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 配置:appSettings->Log_TestingInterval 单位:秒
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; TestingInterval
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;if</span> (_TestingInterval <= <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
            {
                </span><span style="color: #0000ff;"&gt;var</span> Log_TestingInterval = GetAppSettings(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Log_TestingInterval</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
                </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(Log_TestingInterval))
                    _TestingInterval </span>= <span style="color: #800080;"&gt;1</span> * <span style="color: #800080;"&gt;60</span> * <span style="color: #800080;"&gt;24</span><span style="color: #000000;"&gt;;
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
                    _TestingInterval </span>=<span style="color: #000000;"&gt; Convert.ToInt32(Log_TestingInterval.toCompute());
            }
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _TestingInterval;
        }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 删除 N分钟(最后修改时间)之前的的日志
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; _DelInterval;
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 删除 N分钟(最后修改时间)之前的的日志 默认:15天
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 配置:appSettings->Log_DelInterval 单位:秒
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; DelInterval
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;if</span> (_DelInterval <= <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
            {
                </span><span style="color: #0000ff;"&gt;var</span> Log_DelInterval = GetAppSettings(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Log_DelInterval</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
                </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(Log_DelInterval))
                    _DelInterval </span>= <span style="color: #800080;"&gt;1</span> * <span style="color: #800080;"&gt;60</span> * <span style="color: #800080;"&gt;24</span> * <span style="color: #800080;"&gt;15</span><span style="color: #000000;"&gt;;
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
                    _DelInterval </span>=<span style="color: #000000;"&gt; Convert.ToInt32(Log_DelInterval.toCompute());
            }
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _DelInterval;
        }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 部分日志文件大小(Byte)
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; _SectionlogFileSize;
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 部分日志文件大小(Byte) 默认:1024Byte * 1024 * 1 = 1MB
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 配置:appSettings->Log_SectionlogFileSize 单位:Byte
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; SectionlogFileSize
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;if</span> (_SectionlogFileSize <= <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
            {
                </span><span style="color: #0000ff;"&gt;var</span> Log_SectionlogFileSize = GetAppSettings(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Log_SectionlogFileSize</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
                </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(Log_SectionlogFileSize))
                    _SectionlogFileSize </span>= <span style="color: #800080;"&gt;1024</span> * <span style="color: #800080;"&gt;1024</span> * <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
                    _SectionlogFileSize </span>=<span style="color: #000000;"&gt; Convert.ToInt32(Log_SectionlogFileSize.toCompute());
            }
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _SectionlogFileSize;
        }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#region</span> 变动文件大小(Byte)
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; _FileSize;
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 变动文件大小(Byte) 默认:1024 * 1024 * 4 = 4M
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 配置:appSettings->Log_FileSize 单位:Byte
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; FileSize
    {
        </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;
        {
            </span><span style="color: #0000ff;"&gt;if</span> (_FileSize <= <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
            {
                </span><span style="color: #0000ff;"&gt;var</span> Log_FileSize = GetAppSettings(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Log_FileSize</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
                </span><span style="color: #0000ff;"&gt;if</span> (<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(Log_FileSize))
                    _FileSize </span>= <span style="color: #800080;"&gt;1024</span> * <span style="color: #800080;"&gt;1024</span> * <span style="color: #800080;"&gt;4</span><span style="color: #000000;"&gt;;
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
                    _FileSize </span>=<span style="color: #000000;"&gt; Convert.ToInt32(Log_FileSize.toCompute());
            }
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _FileSize;
        }
    }
    </span><span style="color: #0000ff;"&gt;#endregion</span>

    <span style="color: #0000ff;"&gt;#endregion</span><span style="color: #000000;"&gt;
}

}

<span style="color: #0000ff;">namespace<span style="color: #000000;"> CommonLib.HiLog
{
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 异步单线程
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #0000ff;">public
<span style="color: #0000ff;">class
<span style="color: #000000;"> LogSave
{
<span style="color: #808080;">///
<span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 获得Exception 的详细信息
<span style="color: #808080;">/// <span style="color: #808080;">

<span style="color: #808080;">/// <span style="color: #808080;"><param name="ex">
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">string<span style="color: #000000;"> GetExceptionInfo(Exception ex)
{
StringBuilder str = <span style="color: #0000ff;">new<span style="color: #000000;"> StringBuilder();
str.Append(<span style="color: #800000;">"<span style="color: #800000;">错误信息:<span style="color: #800000;">" +<span style="color: #000000;"> ex.Message);
str.Append(<span style="color: #800000;">"<span style="color: #800000;">rn错误源:<span style="color: #800000;">" +<span style="color: #000000;"> ex.Source);
str.Append(<span style="color: #800000;">"<span style="color: #800000;">rn异常方法:<span style="color: #800000;">" +<span style="color: #000000;"> ex.TargetSite);
str.Append(<span style="color: #800000;">"<span style="color: #800000;">rn堆栈信息:<span style="color: #800000;">" +<span style="color: #000000;"> ex.StackTrace);
<span style="color: #0000ff;">return<span style="color: #000000;"> str.ToString();
}

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 系统 自动 捕捉异常
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 保存异常详细信息 
    </span><span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 包括: 浏览器  浏览器版本 操作系统 页面  Exception
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="ex"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="fileName"&gt;</span><span style="color: #008000;"&gt;文件名 默认:SysErr</span><span style="color: #808080;"&gt;</param></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> SysErrLogSave(Exception ex,<span style="color: #0000ff;"&gt;string</span> fileName = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
    {
        StringBuilder str </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; StringBuilder();
        </span><span style="color: #0000ff;"&gt;string</span> ip = <span style="color: #800000;"&gt;""</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;if</span> (HttpContext.Current.Request.ServerVariables.Get(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;HTTP_X_FORWARDED_FOR</span><span style="color: #800000;"&gt;"</span>) != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
            ip </span>= HttpContext.Current.Request.ServerVariables.Get(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;HTTP_X_FORWARDED_FOR</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;).ToString().Trim();
        </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
            ip </span>= HttpContext.Current.Request.ServerVariables.Get(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Remote_Addr</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;).ToString().Trim();
        str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Ip:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ip);
        str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rn浏览器:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; HttpContext.Current.Request.Browser.Browser.ToString());
        str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rn浏览器版本:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; HttpContext.Current.Request.Browser.MajorVersion.ToString());
        str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rn操作系统:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; HttpContext.Current.Request.Browser.Platform.ToString());
        str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rn页面:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; HttpContext.Current.Request.Url.ToString());
        str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rn</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; GetExceptionInfo(ex));
        LogHelper.logWrite(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; LogModel()
        {
            logFileName </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;SysErr</span><span style="color: #800000;"&gt;"</span> + fileName ?? <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.Empty,logMessg </span>=<span style="color: #000000;"&gt; str.ToString()
        });
    }

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 异常日志记录
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="strmes"&gt;</param></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="ex"&gt;</param></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> ErrLogSave(<span style="color: #0000ff;"&gt;string</span> strmes,Exception ex,<span style="color: #0000ff;"&gt;string</span> fileName = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
    {
        StringBuilder str </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; StringBuilder();
        str.Append(strmes);
        </span><span style="color: #0000ff;"&gt;if</span> (ex != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
            str.Append(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;rn</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; GetExceptionInfo(ex));
        LogHelper.logWrite(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; LogModel()
        {
            logFileName </span>= fileName ?? <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Err</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,logMessg </span>=<span style="color: #000000;"&gt; str.ToString()
        });
    }

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 警告日志记录
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="str"&gt;</param></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> WarnLogSave(<span style="color: #0000ff;"&gt;string</span> str,<span style="color: #0000ff;"&gt;string</span> fileName = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (str != <span style="color: #0000ff;"&gt;null</span> &amp;&amp; !<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(str.Trim()))
            LogHelper.logWrite(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; LogModel()
            {
                logFileName </span>= fileName ?? <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Warn</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,logMessg </span>=<span style="color: #000000;"&gt; str
            });
    }

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 追踪日志记录
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="str"&gt;</param></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> TrackLogSave(<span style="color: #0000ff;"&gt;string</span> str,<span style="color: #0000ff;"&gt;string</span> fileName = <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (str != <span style="color: #0000ff;"&gt;null</span> &amp;&amp; !<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(str.Trim()))
            LogHelper.logWrite(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; LogModel()
            {
                logFileName </span>= fileName ?? <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Track</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,logMessg </span>=<span style="color: #000000;"&gt; str
            });
    }

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 追踪日志记录
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<param name="str"&gt;</param></span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> TrackLogSave(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; str)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;.IsNullOrEmpty(str.Trim()))
            LogHelper.logWrite(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; LogModel()
            {
                logFileName </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;SqlTrack</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,logMessg </span>=<span style="color: #000000;"&gt; str
            });
    }
}

}

写好之后,下次我在别的项目里面就直接引用。

如果你使用的是EF,那么我再告诉你一个小秘密。??中的??可以直接记录所有EF执行的sql语句和参数。

使用如:?? 而LogSave.TrackLogSave我们在上面已经封装过。

???

文章阅读量统计

我在一开始就琢磨着怎么统计阅读量。之前也在的最后提出了这个疑问。

遗憾的是,并没有谁告诉我更好的解决方案。

好吧,靠人不如靠己。还是自己瞎折腾吧。

但是,实现方式还是使用的我自己的提出的“

1、我们在每次浏览器访问的时候都种下cookie,并设置过期时间为24小时。下次,浏览器访问的时候。我们检测如果存在我们种下的cookie。则直接忽略。

2、如果没有带上我们的cookie。我们就先组合“联合主键”。然后检测24小时内的记录有没有这个“联合主键”。如果有,则忽略,否则在原有阅读量的基础上加一,然后存入“联合主键”。

这里的"联合主键"有个小技巧。大家肯定都发现了,这个主键有点长。存数据库有点浪费空间(),然后查询检索应该也会慢些吧()。我们想想,其实我们要的不是这么长一串东东。其实,我们只要得到这串东西代表的唯一性就可以了。那么我们可以用到md5,咱不管你是1G、2G还是高清或是无码。统统给你返回一定长度字符串()。

随着数据的增加,这个统计阅读量的表数据,肯定是所有表中最大的。然而,我们统计阅读量是在,点击访问文章的时候,然后在统计阅读量这个环节卡太久,给人的感觉就是这个页面访问太慢,体验不好。

然而,我们每次统计都需要检测数据库里面是否存在,且数据量还不小。那我们只有再开个进程来做统计。

具体实现代码:

判断是否阅读过 如果没有 这在BlogReadInfo 插入一条标识信息 IsRead(Blogs.ModelDB.Blogs blogobj, (blogobj.BlogReadInfo.Where(t => t.MD5 == md5 && t.LastTime.AddHours() > DateTime.Now).Count() > blogobj.BlogReadInfo.Add(== ====
统计阅读量 异步调用方法 SaveReadDelegate(ModelDB.Blogs blogobj, SaveReadNum(ModelDB.Blogs blogobj,), isup = = blogtemp = blogbll.GetList(t => t.Id == blogobj.Id,isAsNoTracking: (blogtemp.BlogReadNum == = (!++=
获取客户端标识(伪) GetUserDistinguish(HttpRequestBase requestt, IsMD5 = StringBuilder str = ip = (requestt.ServerVariables.AllKeys.Contains() && requestt.ServerVariables.Get() != = requestt.ServerVariables.Get(= requestt.ServerVariables.Get( + + + + + str.Append( + + + +浏览器的分辨率(像素):" + Request["width"].ToString() + "*" + Request["height"].ToString()); str.Append( + +

然后我们通过委托从线程池抓去线程异步调用

SaveReadDelegate(SaveReadNum).BeginInvoke(blogobj,GetUserDistinguish(Request),,);

ok,统计完事。?

如果您对本篇文章感兴趣,那就麻烦您点个赞,您的鼓励将是我的动力。 ? ? ?

当然您还可以加入QQ群:讨论。

如果您有更好的处理方式,希望不要吝啬赐教。

一步步开发自己的博客 .NET版系列:

本文链接:?

开源地址:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读