aisl-sdk/cStuff/log.c

102 lines
1.9 KiB
C

/******************************************************************************
*
* Copyright (c) 2017-2019 by Löwenware Ltd
* Please, refer LICENSE file for legal information
*
******************************************************************************/
/**
* @file log.c
* @author Ilja Kartašov <ik@lowenware.com>
* @brief cStuff log module source file
*
* @see https://lowenware.com/
*/
#include <time.h>
#include "log.h"
void
cstuff_log_init(cstuff_log_t self, uint8_t level)
{
self->target = stderr;
self->level = level;
}
void
cstuff_log_release(cstuff_log_t self)
{
if (self->target != stderr)
fclose(self->target);
}
cstuff_retcode_t
cstuff_log_set_file(cstuff_log_t self, const char * filename)
{
FILE * fp;
if ( !(fp = fopen(filename, "a")) )
return CSTUFF_SYSCALL_ERROR;
self->target = fp;
return CSTUFF_SUCCESS;
}
int
cstuff_log_printf(cstuff_log_t self, uint8_t level, const char * format, ...)
{
int result;
va_list vl;
va_start(vl, format);
result = cstuff_log_vprintf(self, level, format, vl);
va_end(vl);
return result;
}
int
cstuff_log_vprintf(cstuff_log_t self,
uint8_t level,
const char * format,
va_list vl)
{
int result;
if (self->level & level)
{
FILE * f = self->target;
char * label;
time_t rawtime;
char strtime[32+1];
struct tm timeinfo;
time (&rawtime);
localtime_r (&rawtime, &timeinfo);
strftime (strtime, 32, "%F %T", &timeinfo);
switch (level)
{
case CSTUFF_LOG_ERROR : label = "!!"; break;
case CSTUFF_LOG_ALERT : label = "~!"; break;
case CSTUFF_LOG_DEBUG : label = "**"; break;
default : label = "--";
}
result = fprintf(f, "%s %s ", strtime, label);
result += vfprintf(f, format, vl);
fputc('\n', f);
result++;
fflush(f);
}
else
result = 0;
return result;
}