Windows下一个简单的日志系统的C代码实现

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:        问题描述       实现一个简单的基于Windows的日志系统,要求写入日志文件的内容的样式如下:       [时间]+[文件名]+[日志等级]+日志具体内容       如:       [2015.

       问题描述

       实现一个简单的基于Windows的日志系统,要求写入日志文件的内容的样式如下:

       [时间]+[文件名]+[日志等级]+日志具体内容

       如:

       [2015.02.2514:35:13.143][WriteLog.c][INFO]This is a test!

       其中,“2015.02.25 14:35:13.143”为当前时间(精确到毫秒),“WriteLog.c”为所打印的日志内容所在的文件名,“INFO”为日志的等级,“This is a test!”为日志的具体内容。

 

       算法流程

图1 程序总体执行流程

 

图2 写日志操作总体执行流程

 

        C代码实现

/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:WriteLog.c
* 文件标识:无
* 内容摘要:演示日志信息的打印方法
* 其它说明:无
* 当前版本:V1.0
* 作    者:Zhou Zhaoxiong
* 完成日期:20150225
*
**********************************************************************/
#include 
  
   
#include 
   
   
    

// 重定义数据类型
typedef signed   int    INT32;
typedef unsigned int    UINT32;
typedef unsigned char   UINT8;

// 全局变量
UINT32  g_iLogLevel      = 0;    // 日志等级
UINT8   g_szLogFile[100] = {0};  // 带路径的日志文件名

// 宏定义
#define LOG_FATAL       0     // 严重错误
#define LOG_ERROR       1     // 一般错误
#define LOG_WARN        2     // 警告
#define LOG_INFO        3     // 一般信息
#define LOG_TRACE       4     // 跟踪信息
#define LOG_DEBUG       5     // 调试信息
#define LOG_ALL         6     // 所有信息


// 函数声明
void   WriteLogFile(UINT32 iLogLevel, UINT8 *pszContent);
UINT8 *LogLevel(UINT32 iLogLevel);
void   GetTime(UINT8 *pszTimeStr);
INT32  main();


/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号     修改人            修改内容
* -------------------------------------------------------------------
* 20150225        V1.0     Zhou Zhaoxiong        创建
***********************************************************************/
INT32 main()
{
    UINT8  szConfigFile[128]  = {0};
    UINT8  szLogContent[1024] = {0};
    UINT8  szLogDir[128]      = {0};
    UINT32 iLoopFlag          = 0;

    // 获取配置文件全路径(包括文件名)
    GetCurrentDirectory(sizeof(szConfigFile)-1, szConfigFile);
    strcat(szConfigFile, "\\");
    strcat(szConfigFile, "Config.ini");

    // 日志等级
    g_iLogLevel = GetPrivateProfileInt("LOG", "LogLevel", 3, szConfigFile);

    // 日志文件存放目录
    GetPrivateProfileString("LOG", "LogDir", "", szLogDir, sizeof(szLogDir), szConfigFile);
    _snprintf(g_szLogFile, sizeof(g_szLogFile)-1, "%s\\WriteLog.log", szLogDir);
    
    // 打印第一条日志
    _snprintf(szLogContent, sizeof(szLogContent)-1, "The first log info!");
    WriteLogFile(LOG_INFO, szLogContent);

    // 打印第二条日志
    _snprintf(szLogContent, sizeof(szLogContent)-1, "The second log info!");
    WriteLogFile(LOG_DEBUG, szLogContent);

    // 打印0到9的10个数
    for (iLoopFlag=0; iLoopFlag g_iLogLevel)
    {
        return;
    }

    fp = fopen(g_szLogFile, "at+");      // 打开文件, 每次写入的时候在后面追加
    if (fp == NULL)
    {
        return;
    }

    // 写入日志时间
    GetTime(szTimeStr);
    fputs(szTimeStr, fp);

    // 写入日志内容
    // 在原内容中添加日志等级标识
    _snprintf(szLogContent, sizeof(szLogContent)-1, "[WriteLog.c][%s]%s\n", LogLevel(iLogLevel), pszContent);
    fputs(szLogContent, fp);
    
    fflush(fp);     // 刷新文件
    fclose(fp);     // 关闭文件
    fp = NULL;      // 将文件指针置为空

    return;
}


/**********************************************************************
 * 功能描述: 获取对应的日志等级
 * 输入参数: iLogLevel-日志等级
 * 输出参数: 无
 * 返 回 值: 日志等级信息字符串
 * 其它说明: 无
 * 修改日期        版本号        修改人        修改内容
 * -------------------------------------------------------------------
 * 20150225        V1.0      Zhou Zhaoxiong      创建
 ********************************************************************/ 
UINT8 *LogLevel(UINT32 iLogLevel)
{
    switch (iLogLevel)
    {
        case LOG_FATAL:
	{
		return "FATAL";
	}

        case LOG_ERROR:   
	{
	        return "ERROR";
	}

        case LOG_WARN :
	{
		return "WARN";
	}

        case LOG_INFO :
	{
		return "INFO";
        }

        case LOG_TRACE:   
	{
		return "TRACE";
	}

        case LOG_DEBUG:   
	{
		return "DEBUG";
	}

	case LOG_ALL:   
	{
		return "ALL";
	}

        default: 
	{
		return "OTHER";
	}
    }
}


/**********************************************************************
 * 功能描述: 获取时间串
 * 输入参数: 无
 * 输出参数: pszTimeStr-时间串
 * 返 回 值: 无
 * 其它说明: 无
 * 修改日期        版本号        修改人        修改内容
 * -------------------------------------------------------------------
 * 20150225        V1.0      Zhou Zhaoxiong      创建
 ********************************************************************/ 
void GetTime(UINT8 *pszTimeStr)
{
    SYSTEMTIME  tSysTime = {0};

    GetLocalTime(&tSysTime);
    sprintf(pszTimeStr, "[%04d.%02d.%02d %02d:%02d:%02d.%03d]", 
        tSysTime.wYear, tSysTime.wMonth, tSysTime.wDay,
        tSysTime.wHour, tSysTime.wMinute, tSysTime.wSecond,
        tSysTime.wMilliseconds);

    return;
}

   
   
  
  

       配置文件内容

       配置文件命名为Config.ini,其内容形如:

       [LOG]

       ;LogLevel, 0-Fatal 1-Error 2-Warn 3-Info 4-Trace 5-Debug 6-All

       LogLevel=5

       ;Log dir

       LogDir=D:\\Test

 

       其中,“LogLevel”表示日志等级,“LogDir”表示日志文件存放的路径(注意:最后不要用\\结尾)。要根据实际的需要来改变各个配置项的值。

 

       程序说明

       (1)本程序直接在VC++中编译运行。

       (2)配置文件Config.ini直接放到与WriteLog.c文件同级的工程目录下即可。

       (3)通过改变“LogLevel”的配置值,可选择性地打印一些日志信息。

 

       程序运行结果

       (1)将“LogLevel”配为3,日志文件的内容如下:

 

       (2)将“LogLevel”配为5,日志文件的内容如下:

 

       可见,程序可以根据配置的日志等级来输出相应的日志信息。

 

 

 

(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
监控 测试技术 开发者
一行代码改进:Logtail的多行日志采集性能提升7倍的奥秘
一个有趣的现象引起了作者的注意:当启用行首正则表达式处理多行日志时,采集性能出现下降。究竟是什么因素导致了这种现象?本文将探索Logtail多行日志采集性能提升的秘密。
115 23
|
2月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
75 32
|
27天前
|
缓存 安全 网络协议
使用事件日志识别常见 Windows 错误
事件查看器是Windows操作系统中的标准诊断工具,用于记录系统事件,包括硬件问题、软件中断和系统行为等详细信息。通过分析这些日志,管理员能够追踪和解决系统错误。访问方法包括使用快捷键Win + R输入eventvwr.msc,或通过控制面板进入。事件查看器中的每条记录包含事件ID、来源和描述,帮助识别和解决问题。常见错误如蓝屏死机、DLL错误、驱动程序错误等,可通过更新驱动程序、运行系统诊断、使用恢复功能等方式解决。
|
1月前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
2月前
|
存储 负载均衡 Java
如何配置Windows主机MPIO多路径访问存储系统
Windows主机多路径(MPIO)是一种技术,用于在客户端计算机上配置多个路径到存储设备,以提高数据访问的可靠性和性能。本文以Windows2012 R2版本为例介绍如何在客户端主机和存储系统配置多路径访问。
126 13
如何配置Windows主机MPIO多路径访问存储系统
|
1月前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
2月前
|
监控 安全 网络安全
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
|
2月前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
198 2
|
3月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
77 1
|
3月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。