今天调程序,要用到日志。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. windows

    1.拷贝远程文件 net use \\10.130.80.62\ipc$ 密码 /user:用户名 xcopy "\\10.130.80.62\G$\yt\apache-tomcat-7.0 ...

  2. LightGBM中GBDT的实现

    现在LightGBM开源了,这里将之前的一个文档发布出来供大家参考,帮助更快理解LightGBM的实现,整体思路应该是类似的. LightGBM优雅,快速,效果好,希望LightGBM越来越好:) L ...

  3. byte[] 转十进制

    short s = 0; //一个16位整形变量,初值为 0000 0000 0000 0000 byte b1 = 1; //一个byte的变量,作为转换后的高8位,假设初值为 0000 0001 ...

  4. Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法

    问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...

  5. 私有无线传感网 PWSN HLINK

    私有无线传感网,我把其叫做 Personal Wireless Sensor Network.此种网络最另众人所知的就是ZIGBEE了.由于在用户不同的使用场景中,对传感网络有许多不同的要求,例如:通 ...

  6. 用WinForm写的员工考勤项目!!!!!!

    先说几句,作为一个还在学习的程序员,掌握的知识有限:但我利用自身所学,给一些像我一样还在学习的码农提供我的绵薄之力! 写的不好,但是尽力了,希望大牛指点.多多吐槽!!! 好了开始说项目需求: 实现新增 ...

  7. 安卓开发error opening trace file: No such file or directory (2)报错原因

    error opening trace file: No such file or directory (2) 这个问题的出现是因为运行的测试机android系统版本和项目api不一致导致. 改成一样 ...

  8. iOS 常用第三方类库、完整APP示例

    一.第三方类库 1:基于响应式编程思想的oc地址:https://github.com/ReactiveCocoa/ReactiveCocoa2:hud提示框地址:https://github.com ...

  9. CompiledEffect Direct3D9 Sample fxc.exe

  10. bash快捷键

    https://linuxtoy.org/archives/bash-shortcuts.html 编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按 ...