今天调程序,要用到日志。XE7有Qlog,D7用什么

从网上找到了Logger,下载的原文是不支持D7的,不过也只是很少的地方不同,自己修改了下就可以用了

感谢原作者和红鱼的分享

unit Logger;
// =======================================================================
// 鏃ュ織绫伙紙TLogger锛?ver.1.0
// 绾㈤奔鍎?http://blog.sina.com.cn/hblyuhong
// 2014/06/24
// 鍩轰簬1.0淇敼
// PFeng (http://www.pfeng.org / xxmc01#gmail.com)
// 2012/11/08
// 鏃ュ織绾у埆绾﹀畾锛?
// 0 - Information
// 1 - Notice
// 2 - Warning
// 3 - Error
// ======================================================================= interface uses Windows, Classes, SysUtils, StdCtrls, ComCtrls, ComObj, Messages; const
WRITE_LOG_DIR = 'log\'; // 璁板綍鏃ュ織榛樿鐩綍
WRITE_LOG_MIN_LEVEL = ; // 璁板綍鏃ュ織鐨勬渶浣庣骇鍒紝灏忎簬姝ょ骇鍒彧鏄剧ず涓嶈褰?
WRITE_LOG_ADD_TIME = True; // 璁板綍鏃ュ織鏄惁娣诲姞鏃堕棿
WRITE_LOG_TIME_FORMAT = 'hh:nn:ss.zzz'; // 璁板綍鏃ュ織娣诲姞鏃堕棿鐨勬牸寮?
SHOW_LOG_ADD_TIME = True; // 鏃ュ織鏄剧ず瀹瑰櫒鏄惁娣诲姞鏃堕棿
SHOW_LOG_TIME_FORMAT = 'yyyy/mm/dd hh:nn:ss.zzz'; // 鏃ュ織鏄剧ず娣诲姞鏃堕棿鐨勬牸寮?
SHOW_LOG_CLEAR_COUNT = ; // 鏃ュ織鏄剧ず瀹瑰櫒鏈€澶ф樉绀烘潯鏁? type
TLogger = class
private
FCSLock: TRTLCriticalSection; // 涓寸晫鍖?
FFileStream: TFileStream; // 鏂囦欢娴?
FLogShower: TComponent; // 鏃ュ織鏄剧ず瀹瑰櫒
FLogName: String; // 鏃ュ織鍚嶇О
FEnabled: Boolean;
FLogFileDir: string; // 鏃ュ織鐩綍
procedure SetEnabled(const Value: Boolean);
procedure SetLogFileDir(const Value: string);
procedure SetLogShower(const Value: TComponent);
protected
procedure ShowLog(Log: String; const LogLevel: Integer = );
public
procedure WriteLog(Log: String; const LogLevel: Integer = ); overload;
procedure WriteLog(Log: String; const Args: array of const; const LogLevel: Integer = ); overload; constructor Create;
destructor Destroy; override; // 启用
property Enabled: Boolean read FEnabled write SetEnabled;
// 日志目录
property LogFileDir: string read FLogFileDir write SetLogFileDir;
// 显示控件
property LogShower: TComponent read FLogShower write SetLogShower; end; implementation constructor TLogger.Create;
begin
InitializeCriticalSection(FCSLock);
FLogShower := nil;
LogFileDir := ExtractFilePath(ParamStr()) + WRITE_LOG_DIR;
end; procedure TLogger.WriteLog(Log: String; const Args: array of const; const LogLevel: Integer = );
begin
WriteLog(Format(Log, Args), LogLevel);
end; procedure TLogger.WriteLog(Log: String; const LogLevel: Integer = );
var
logName: String;
fMode: Word;
Fstrs:TStringStream;
begin
EnterCriticalSection(FCSLock);
try
if not Enabled then
Exit; ShowLog(Log, LogLevel); // 鏄剧ず鏃ュ織鍒板鍣?
if LogLevel >= WRITE_LOG_MIN_LEVEL then
begin
logName := FormatDateTime('yyyymmdd', Now) + '.log';
if FLogName <> logName then
begin
FLogName := logName;
if FileExists(FLogFileDir + FLogName) then // 濡傛灉褰撳ぉ鐨勬棩蹇楁枃浠跺瓨鍦?
fMode := fmOpenWrite or fmShareDenyNone
else
fMode := fmCreate or fmShareDenyNone; if Assigned(FFileStream) then
FreeAndNil(FFileStream);
FFileStream := TFileStream.Create(FLogFileDir + FLogName, fMode);
end; FFileStream.Position := FFileStream.Size; // 杩藉姞鍒版渶鍚?
case LogLevel of
:
Log := '[Information] ' + Log;
:
Log := '[Notice] ' + Log;
:
Log := '[Warning] ' + Log;
:
Log := '[Error] ' + Log;
end;
if WRITE_LOG_ADD_TIME then
Log := FormatDateTime(WRITE_LOG_TIME_FORMAT, Now) + ' ' + Log + ##; Fstrs:=TStringStream.Create(log);
Fstrs.Position:=;
FFileStream.CopyFrom(Fstrs,Fstrs.Size);
end;
finally
FreeAndNil(Fstrs);
LeaveCriticalSection(FCSLock);
end;
end; procedure TLogger.SetEnabled(const Value: Boolean);
begin
FEnabled := Value;
end; procedure TLogger.SetLogFileDir(const Value: string);
begin
FLogFileDir := Value;
if not DirectoryExists(FLogFileDir) then
if not ForceDirectories(FLogFileDir) then
begin
raise Exception.Create('日志路径错误,日志类对象不能被创建');
end;
end; procedure TLogger.SetLogShower(const Value: TComponent);
begin
FLogShower := Value;
end; procedure TLogger.ShowLog(Log: String; const LogLevel: Integer = );
var
lineCount: Integer;
listItem: TListItem;
begin
if FLogShower = nil then
Exit;
if (FLogShower is TMemo) then
begin
if SHOW_LOG_ADD_TIME then
Log := FormatDateTime(SHOW_LOG_TIME_FORMAT, Now) + ' ' + Log;
lineCount := TMemo(FLogShower).Lines.Add(Log);
// 滚动到最后一个
SendMessage(TMemo(FLogShower).Handle, WM_VSCROLL, SB_LINEDOWN, );
if lineCount >= SHOW_LOG_CLEAR_COUNT then
TMemo(FLogShower).Clear;
end
else if (FLogShower is TListBox) then
begin
if SHOW_LOG_ADD_TIME then
Log := FormatDateTime(SHOW_LOG_TIME_FORMAT, Now) + ' ' + Log;
lineCount := TListBox(FLogShower).Items.Add(Log);
SendMessage(TListBox(FLogShower).Handle, WM_VSCROLL, SB_LINEDOWN, );
if lineCount >= SHOW_LOG_CLEAR_COUNT then
TListBox(FLogShower).Clear;
end
else if (FLogShower is TListView) then
begin
listItem := TListView(FLogShower).Items.Add;
if SHOW_LOG_ADD_TIME then
listItem.Caption := FormatDateTime(SHOW_LOG_TIME_FORMAT, Now);
if Assigned(TListView(FLogShower).SmallImages) and (TListView(FLogShower).SmallImages.Count - >= LogLevel) then
listItem.ImageIndex := LogLevel; // 根据不同等级显示不同图片
listItem.SubItems.Add(Log);
SendMessage(TListView(FLogShower).Handle, WM_VSCROLL, SB_LINEDOWN, );
if TListView(FLogShower).Items.Count >= SHOW_LOG_CLEAR_COUNT then
TListView(FLogShower).Items.Clear;
end
else
raise Exception.Create('日志容器类型不支持' + FLogShower.ClassName);
end; destructor TLogger.Destroy;
begin
DeleteCriticalSection(FCSLock);
if Assigned(FFileStream) then
FreeAndNil(FFileStream);
end; end.

TLogger一个D7可用的轻量级日志的更多相关文章

  1. 日志采集框架Flume以及Flume的安装部署(一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统)

    Flume支持众多的source和sink类型,详细手册可参考官方文档,更多source和sink组件 http://flume.apache.org/FlumeUserGuide.html Flum ...

  2. 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)

    前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...

  3. 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)

    Exceptionless是一个非常优秀的事件记录服务,目前我们的自部署的Exceptionless已经稳定运行了近一年的时间,收集了千万条事件信息.但Exceptionless官方自宿主部署的文档不 ...

  4. SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

    前言 本篇主要介绍的是SpringCloud相关知识.微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka). SpringCloud介绍 Spring Cloud是在Spring B ...

  5. [C#]一个简易的、轻量级的方法并行执行线程辅助类

      一个简易的.轻量级的方法并行执行线程辅助类 在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并 ...

  6. 一个.net下的轻量级的Serverless 文档数据库LiteDB

    今天发现了一个.net下的轻量级的Serverless 文档数据库LiteDB,感觉还不错 官方网站: http://www.litedb.org/ 项目主页: https://github.com/ ...

  7. Android轻量级日志管理框架

    代码地址如下:http://www.demodashi.com/demo/12134.html ViseLog Android 轻量级日志框架,使用森林对象维护不同的日志树进行日志输出,可以是Logc ...

  8. Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录

    [翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.N ...

  9. 搭建Loki、Promtail、Grafana轻量级日志系统(centos7)

    搭建Loki.Promtail.Grafana轻量级日志系统(centos7)--简称PLG 需求 公司项目采用微服务的架构,服务很多,每个服务都有自己的日志,分别存放在不同的服务器上.当查找日志时需 ...

随机推荐

  1. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  2. POCO库——Foundation组件概述

    Foundation组件作为POCO库的基础组件,主要包含了核心Core.缓存Cache.加解密Crypt.日期时间DateTime.动态类型Dynamic.事件events.文件系统Filesyst ...

  3. 闪回查询(SELECT AS OF)

    使用Flashback Query的场景包括如下: 摘自官档 Recovering lost data or undoing incorrect, committed changes. For exa ...

  4. My year of 2016

    2016, year of excellence.   Year of happiness. In Beijing we can also find some happiness which is s ...

  5. SOUI开发者论坛

    http://www.lumaba.cn/forum.php?mod=forumdisplay&fid=2 需要的朋友可以上去交流.

  6. CozyRSS开发记录16-RssContentView显示

    CozyRSS开发记录16-RssContentView显示 1.RssContentView的布局和绑定 继续参照原型图来写xaml: 然后在RSSContentFrameViewModel里提供绑 ...

  7. WooCommerce插件设置教程之设置主页

    http://demo.themes4wp.com/documentation/homepage-setup/#videoimage-tutorial

  8. 连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB

    用mysql数据库工具连接linuxmysql环境,但是会遇到连接失败的问题,如下所示: 这就需要涉及到另外的问题了,需要我们打开mysql的连接授权,具体的操作步骤如下: 1)在xshell里进入m ...

  9. C#开发中常用方法3------Cookie的存取

    ---------------------------------------------------------------------------------------------------- ...

  10. Dos命令查看端口占用及关闭进程

    1. 查看端口占用 在windows命令行窗口下执行: netstat -aon|findstr "8080" TCP 127.0.0.1:80 0.0.0.0:0 LISTENI ...