Linux C++ 打日志程序和获取上一级目录的程序
2016-11-07 18:21
2091 查看
1.写程序,经常会需要打日志,往往可执行文件放在bin目录下,而log文件放在和bin目录同级的log目录下。
2.日志常常被要求,以时间作为日志文件名的开头。
3.日志里面的内容,每一行也必须要以时间戳开头,然后才是日志正文。
下面的代码,很好的实现了这几个功能。
不过,还是存在2个问题:
(1)不支持多线程打日志
(2)没有进行日志分级
以后,继续改进。
#include <cstdlib>
#include <string>
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#define PROCESSNAME "createxcel.log"
#define LOGBUFLEN 512
#define PATH_MAX 260
using namespace std;
//
//Description : 获取可执行文件的上一级目录
//
char* GetPath(){
char dir[PATH_MAX] = {0};
char syspath[PATH_MAX] = {0};
int n = readlink("/proc/self/exe", dir, PATH_MAX);
const char *ptr;
ptr = strrchr(dir, '/');
int length = strlen(dir) - strlen(ptr);
string s1(dir);
string s2;
s2 = s1.substr(0, length);
memcpy(syspath, (char*)s2.data(), PATH_MAX);
ptr = strrchr(syspath, '/');
length = strlen(syspath) - strlen(ptr);
s2 = s2.substr(0, length);
cout << "dir : " << dir << endl;
cout << "syspath : " << syspath << endl;
cout << "s2 : " << s2 << endl;
return (char*)s2.data();
}
//
//Description : (1)如果可执行文件的上一级目录,具有平级目录log,
// 则在log文件夹下,以日期作为文件名开头来打日志。
// 例如:2016-11-07_createxcel.log
// (2)如果没有这个log文件夹,则会创建log文件夹
//
void WriteLog(const char* msg)
{
char *sSysPath = GetPath();
char buf[LOGBUFLEN];
int i = 0;
memset(buf, 0, LOGBUFLEN);
memcpy(buf,msg,LOGBUFLEN);
FILE* logfile=NULL;
char logpath[256] = {0};
sprintf(logpath,"%s/log", sSysPath);
if(access(logpath,0)!=0)
{
char cmdstr[256] = {0};
sprintf(cmdstr,"mkdir -p %s",logpath);
system(cmdstr);
}
char fname[256];
char longtime[200];
char daytime[40];
time_t t;
memset(fname,0,sizeof(fname));
time(&t);
struct tm local = {0};
localtime_r(&t, &local);
sprintf(longtime,"%04d-%02d-%02d %02d:%02d:%02d", local.tm_year+1900,
local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
sprintf(daytime, "%04d-%02d-%02d", local.tm_year+1900,
local.tm_mon+1, local.tm_mday);
sprintf(fname,"%s/%s_%s", logpath, daytime, PROCESSNAME);
for(i= 0; i < 3; i++)
{
logfile = fopen(fname, "a+");
if(logfile)
break;
sleep(1);
}
if(logfile)
{
//日期时间
const char* pTemp = longtime;
fwrite(pTemp, 1, strlen(pTemp), logfile);
fwrite(" ", 1, 1, logfile);
//内容
fwrite(buf, 1, strlen(buf), logfile);
fwrite(" \r\n", 1, 3, logfile);
fclose(logfile);
}
}
int main(int argc, char** argv) {
WriteLog("hello 123");
return 0;
}
CentOS 6.7 系统,测试可用。
================================
2.日志常常被要求,以时间作为日志文件名的开头。
3.日志里面的内容,每一行也必须要以时间戳开头,然后才是日志正文。
下面的代码,很好的实现了这几个功能。
不过,还是存在2个问题:
(1)不支持多线程打日志
(2)没有进行日志分级
以后,继续改进。
#include <cstdlib>
#include <string>
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#define PROCESSNAME "createxcel.log"
#define LOGBUFLEN 512
#define PATH_MAX 260
using namespace std;
//
//Description : 获取可执行文件的上一级目录
//
char* GetPath(){
char dir[PATH_MAX] = {0};
char syspath[PATH_MAX] = {0};
int n = readlink("/proc/self/exe", dir, PATH_MAX);
const char *ptr;
ptr = strrchr(dir, '/');
int length = strlen(dir) - strlen(ptr);
string s1(dir);
string s2;
s2 = s1.substr(0, length);
memcpy(syspath, (char*)s2.data(), PATH_MAX);
ptr = strrchr(syspath, '/');
length = strlen(syspath) - strlen(ptr);
s2 = s2.substr(0, length);
cout << "dir : " << dir << endl;
cout << "syspath : " << syspath << endl;
cout << "s2 : " << s2 << endl;
return (char*)s2.data();
}
//
//Description : (1)如果可执行文件的上一级目录,具有平级目录log,
// 则在log文件夹下,以日期作为文件名开头来打日志。
// 例如:2016-11-07_createxcel.log
// (2)如果没有这个log文件夹,则会创建log文件夹
//
void WriteLog(const char* msg)
{
char *sSysPath = GetPath();
char buf[LOGBUFLEN];
int i = 0;
memset(buf, 0, LOGBUFLEN);
memcpy(buf,msg,LOGBUFLEN);
FILE* logfile=NULL;
char logpath[256] = {0};
sprintf(logpath,"%s/log", sSysPath);
if(access(logpath,0)!=0)
{
char cmdstr[256] = {0};
sprintf(cmdstr,"mkdir -p %s",logpath);
system(cmdstr);
}
char fname[256];
char longtime[200];
char daytime[40];
time_t t;
memset(fname,0,sizeof(fname));
time(&t);
struct tm local = {0};
localtime_r(&t, &local);
sprintf(longtime,"%04d-%02d-%02d %02d:%02d:%02d", local.tm_year+1900,
local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
sprintf(daytime, "%04d-%02d-%02d", local.tm_year+1900,
local.tm_mon+1, local.tm_mday);
sprintf(fname,"%s/%s_%s", logpath, daytime, PROCESSNAME);
for(i= 0; i < 3; i++)
{
logfile = fopen(fname, "a+");
if(logfile)
break;
sleep(1);
}
if(logfile)
{
//日期时间
const char* pTemp = longtime;
fwrite(pTemp, 1, strlen(pTemp), logfile);
fwrite(" ", 1, 1, logfile);
//内容
fwrite(buf, 1, strlen(buf), logfile);
fwrite(" \r\n", 1, 3, logfile);
fclose(logfile);
}
}
int main(int argc, char** argv) {
WriteLog("hello 123");
return 0;
}
CentOS 6.7 系统,测试可用。
================================
相关文章推荐
- linux下获取程序当前目录绝对路径
- linux下获取程序当前目录绝对路径
- 用python获取linux下一个目录下一级目录的各自大小
- linux开机启动过程、PATH、过滤一级目录、cd的参数、ls -lrt、命令切割日志
- Python 实现根据不同的程序运行环境存放日志目录,Python实现Linux和windows系统日志的存放
- Windows & Linux(Unix) 获取当前程序运行目录
- linux C++ & C 读取指定目录下的指定后缀名,去除处扩展名获取名字存至数组
- linux下获取程序当前目录绝对路径
- Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间
- linux开机启动过程、PATH、过滤一级目录、cd的参数、ls -lrt、命令切割日志
- linux下获取程序当前目录绝对路径
- linux-程序开机启动后getcwd()获取当前目录错误
- linux下获取程序当前目录绝对路径
- 纯C/C++程序中如何获取当前目录和程序目录
- linux下获取程序所在目录绝对路径
- c++获取程序目录
- Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间
- linux-程序开机启动后getcwd()获取当前目录错误
- c++判断文件是否存在,判断是文件还是目录,获取文件大小,获取程序所在路径
- 利用C/C++编写程序以获取文件夹内所有子文件名,windows和Linux两个版本都有