using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Web; namespace Com.AppCode.Helper
{
/// <summary>
/// 日志记录到本地文件
/// </summary>
public class Log
{
/// <summary>
/// 调试日志
/// </summary>
/// <param name="msg"></param>
static public void Debug(object msg)
{
WriteLog("Debug", string.Empty, msg);
}
/// <summary>
/// 错误或异常日志
/// </summary>
/// <param name="msg"></param>
static public void Error(object msg)
{
WriteLog("Error", string.Empty, msg);
}
/// <summary>
/// 内容日志
/// </summary>
/// <param name="msg"></param>
static public void Info(object msg)
{
WriteLog("Info", string.Empty, msg);
}
/// <summary>
/// 警告日志
/// </summary>
/// <param name="msg"></param>
static public void Warn(object msg)
{
WriteLog("Warn", string.Empty, msg);
} /// <summary>
/// 微信日志
/// </summary>
static public void Mp(object msg)
{
WriteLog("Mp", string.Empty, msg);
} static private Mutex m_Mutex = new Mutex();
/// <summary>
/// 日志文件记录
/// </summary>
/// <param name="errorType">日志类型</param>
/// <param name="pre">文件前缀可不填写</param>
/// <param name="msg">日志内容</param>
static public void WriteLog(object errorType, object pre, object msg)
{
try
{
m_Mutex.WaitOne();
}
catch (Exception)
{
return;
}
try
{
string dir = "/log/" + errorType + "/";
string dirPath = HttpContext.Current.Server.MapPath(dir);
if (!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
string fileName = pre + DateTime.Today.ToString("yyyyMMdd") + ".log";
string logPath = Path.Combine(dirPath, fileName);
if (!File.Exists(logPath))
{
File.Create(logPath).Close();
}
TextWriter oWrite = File.AppendText(logPath);
string sTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff");
oWrite.WriteLine(sTime + ": " + msg);
oWrite.Close();
}
catch (Exception e)
{
EventLog myLog = new EventLog();
myLog.Source = "Com.Log";
myLog.WriteEntry("Write Log Error:" + msg + "\t" + e.Message);
}
finally
{
m_Mutex.ReleaseMutex();
}
}
}
}

C#记录日志到本地文件工具类的更多相关文章

  1. 自动扫描FTP文件工具类 ScanFtp.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  2. Android FileUtil(android文件工具类)

    android开发和Java开发差不了多少,也会有许多相同的功能.像本文提到的文件存储,在Java项目和android项目里面用到都是相同的.只是android开发的一些路径做了相应的处理. 下面就是 ...

  3. 拍照、本地图片工具类(兼容至Android7.0)

    拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb ...

  4. Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException;import java.io.InputStreamReader;import jav ...

  5. 读取Config文件工具类 PropertiesConfig.java

    package com.util; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io ...

  6. Property工具类,Properties文件工具类,PropertiesUtils工具类

    Property工具类,Properties文件工具类,PropertiesUtils工具类 >>>>>>>>>>>>>& ...

  7. Java 实现删除文件工具类

    工具代码 package com.wangbo; import java.io.File; /** * 删除目录或文件工具类 * @author wangbo * @date 2017-04-11 1 ...

  8. HTTP 下载文件工具类

    ResponseUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.File; im ...

  9. java文件工具类

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

随机推荐

  1. Link static data in sql source control

    You can link data that doesn't change very often to SQL Source Control. This lets you commit data ch ...

  2. 你真的懂wait、notify和notifyAll吗

    生产者消费者模型是我们学习多线程知识的一个经典案例,一个典型的生产者消费者模型如下: public void produce() { synchronized (this) { while (mBuf ...

  3. html js 遮罩层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. osgViewer::View::setUpViewOnSingleScreen()

    void ViewerBase::frame(double simulationTime) { if (_done) return; // OSG_NOTICE<<std::endl< ...

  5. rank SQL 筛选重复数据

    先思考一个问题: 看下面的表数据 问题:现在需要在 A 和 B 相同的前提下对 C desc排序,然后拿到排序中不是第一个的数据?也就是说拿到下面的数据 只用一条 SQL 实现: select * f ...

  6. PAT 甲级 1052 Linked List Sorting (25 分)(数组模拟链表,没注意到不一定所有节点都在链表里)

    1052 Linked List Sorting (25 分)   A linked list consists of a series of structures, which are not ne ...

  7. 《Fluid Engine Development》 学习笔记4-预测校正不可压缩SPH-PCISPH

    传统SPH方案的主要问题之一是时间步长限制.在原始的SPH中,我们首先从当前设置计算密度,使用EOS计算压强,应用压力梯度,然后运行时间积分.这个过程意味着只需要一定的压缩量就可以触发内核半径内的压力 ...

  8. 《C语言程序设计》学习笔记(二)

    第八章 函数 函数的基本概念 定义:函数由函数名.参数和函数体组成. 函数定义的一般形式: 类型说明符 函数名(形式参数声明) { [说明与定义部分] 语句: } 说明: 1.类型说明符用来说明函数的 ...

  9. vue中的$attrs属性和inheritAttrs属性

    一.vue中,默认情况下,调用组件时,传入一些没有在props中定义的属性,会把这些“非法”属性渲染在组件的根元素上(有一些属性除外),而这些“非法”的属性会记录在$attrs属性上. 二.如何控制不 ...

  10. 论文阅读 | Transformer-XL: Attentive Language Models beyond a Fixed-Length Context

    0 简述 Transformer最大的问题:在语言建模时的设置受到固定长度上下文的限制. 本文提出的Transformer-XL,使学习不再仅仅依赖于定长,且不破坏时间的相关性. Transforme ...