loginit

################################################################################
# name    : log_file_init
# describe: initialize log file, and process log file backup.
# input   : null
# output  : null
# rerurn  : 0:success
#           1:failed
# invoker : private
################################################################################
function log_file_init
{
	typeset LOG_FILE_DIR="${HA_LOG_FILE_DIR}"	
	typeset MAX_LOG_FILE_SIZE=10485760
	typeset MAX_LOG_FILE_BACKUP=10
	typeset log_file_name="${HA_LOG_FILE}"
	
	if [ ! -f "${log_file_name}" ]; then		
		if [ ! -d "${LOG_FILE_DIR}" ]; then
			mkdir -p "${LOG_FILE_DIR}" > /dev/null 2>&1
			typeset rt=$?
			chmod 777 "${LOG_FILE_DIR}" > /dev/null 2>&1
			if [ $? -ne 0 -o ${rt} -ne 0 ]; then
				#echo "Creating log dir: ${LOG_FILE_DIR} failed."
				return 1
			fi
		fi
		
		touch "${log_file_name}" > /dev/null 2>&1
		typeset rt=$?
		chmod 777 "${log_file_name}" > /dev/null 2>&1
		if [ $? -ne 0 -o ${rt} -ne 0 ]; then
			#echo "Creating log file: ${log_file_name} failed."
			return 1
		fi
		
		return 0
	fi
	
	typeset file_size=$(wc -c "${log_file_name}" | awk '{ print $1; }')
	if [ ${file_size} -ge ${MAX_LOG_FILE_SIZE} ]; then
		# backup log file name format: ${log_file_name}.yyyymmdd.n
		typeset log_file_base_name=$(basename "${log_file_name}")
		typeset bak_log_file_list=$((cd "${LOG_FILE_DIR}"; ls) | sed -n "/^${log_file_base_name}\.[0-9]\{14\}\.[1-9][0-9]*\$/p" | awk -F. -vmaxnum=${MAX_LOG_FILE_BACKUP} '{ if ($4 <= maxnum ) { print $0; } }' | sort -r -t. -k4 -n)
		if [ "x${bak_log_file_list}" != "x" ]; then
			for logfile in ${bak_log_file_list}
			do
				typeset leadpart=$(echo "${logfile}" | cut -d. -f1-3)
				typeset suffix=$(echo "${logfile}" | cut -d. -f4)
				if [ ${suffix} -eq ${MAX_LOG_FILE_BACKUP} ]; then
					rm -f "${LOG_FILE_DIR}/${logfile}"
					continue
				fi
				
				((suffix=suffix+1))
				(cd "${LOG_FILE_DIR}"; mv -f "${logfile}" "${leadpart}.${suffix}")
			done
		fi
		
		mv -f "${log_file_name}" "${log_file_name}.$(date +'%Y%m%d%H%M%S').1"
		
		# recreate a log file
		touch "${log_file_name}" > /dev/null 2>&1
		typeset rt=$?
		chmod 777 "${log_file_name}" > /dev/null 2>&1
		if [ $? -ne 0 -o ${rt} -ne 0 ]; then
			#echo "Creating log file: ${log_file_name} failed."
			return 1
		fi
		
		return 0
	fi
	
	return 0
}

 

### C语言实现日志记录方法 在C语言中,可以通过文件操作来实现日志记录功能。以下是具体的方式以及其实现细节: #### 1. 初始化日志文件 通过`LogInit`函数可以初始化并打开一个指定路径的日志文件[^1]。此函数接受一个字符串参数`plogpath`,表示日志文件的存储位置。 ```c #include <stdio.h> #include <stdlib.h> FILE *sys_log_file = NULL; int LogInit(const char *plogpath) { sys_log_file = fopen(plogpath, "a"); if (!sys_log_file) { perror("Failed to initialize log file"); return -1; } fprintf(sys_log_file, "Log initialized successfully.\n"); fflush(sys_log_file); return 0; } ``` 上述代码片段展示了如何创建或追加写入到指定的日志文件中,并打印一条初始消息表明日志已成功启动[^4]。 #### 2. 定义日志级别宏 为了使日志更加灵活和易于维护,通常会定义不同的日志级别(如错误、警告、调试信息等)。这些级别的实现可通过宏完成,以便于控制输出内容[^3]。 ```c #define SYS_LOG(level, fmt, ...) \ do { \ if (sys_log_file) { \ fprintf(sys_log_file, "[%s][%s:%d] %s(): " fmt "\n", level, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \ fflush(sys_log_file); \ } \ } while(0) #define SYS_LOG_ERR(fmt, ...) SYS_LOG("ERROR", fmt, ##__VA_ARGS__) #define SYS_LOG_WARN(fmt, ...) SYS_LOG("WARN", fmt, ##__VA_ARGS__) #define SYS_LOG_INFO(fmt, ...) SYS_LOG("INFO", fmt, ##__VA_ARGS__) ``` 以上代码利用了C99标准引入的`__VA_ARGS__`特性,能够动态传递不定数量的参数给日志函数。同时,它还包含了当前执行上下文的信息(例如文件名、行号和函数名称),这有助于快速定位问题所在。 #### 3. 关闭日志资源 当不再需要继续记录日志时,应该关闭已经打开的文件指针以释放系统资源。 ```c void LogClose(void) { if (sys_log_file) { fclose(sys_log_file); sys_log_file = NULL; } } ``` 这样做的好处是可以防止内存泄漏或者意外的数据丢失情况发生。 #### 4. 使用示例 下面是一个完整的例子展示如何使用上面提到的技术构建自己的简易版日志系统。 ```c int main(int argc, char **argv) { if (LogInit("./example.log") != 0) { exit(EXIT_FAILURE); } SYS_LOG_ERR("An unexpected error occurred."); SYS_LOG_WARN("The system is running low on memory."); SYS_LOG_INFO("Application started."); LogClose(); return EXIT_SUCCESS; } ``` 该实例说明了从开启直到结束整个过程中应该如何正确地管理日志生命周期。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值