1. Introduction
The C programming language is widely used in various fields, including system development and embedded systems. In particular, logging functionality is essential for visualizing program behavior, debugging, and detecting errors. This article provides a comprehensive guide from the basics of logging in C to efficient log management techniques. By understanding both fundamental and advanced concepts of logging, you can apply them to improve your actual development process.
2. The C Math Function “log”
C provides a standard mathematical function called log
. This section explains the overview and basic usage of the log
function.
Overview and Usage of the “log” Function
The log
function, defined in the C math library (math.h
), calculates the natural logarithm (logarithm with base e). It is commonly used in statistical analysis and scientific computing.
#include <math.h>
double result = log(10.0); // Calculate the natural logarithm of 10
Difference Between Natural Logarithm and Common Logarithm
The natural logarithm uses base e, while the common logarithm (base 10) can be calculated using the log10
function.
double result = log10(100.0); // Calculate the common logarithm of 100
Error Handling
Passing a negative number or zero to the log
function will cause an error, so input validation is necessary.
if (number > 0) {
result = log(number);
} else {
printf("Please enter a positive number\n");
}
3. Basics of Logging in C
Logging helps monitor program behavior, identify issues, and resolve problems. This section covers basic logging using standard output and writing logs to files.
Basic Logging with Standard Output
To display logs to standard output, use the printf
function.
#include <stdio.h>
int main() {
printf("Program started\n");
int x = 5;
printf("Value of variable x: %d\n", x);
return 0;
}
Writing Logs to a File
To record logs in a file, open it with fopen
and write logs using fprintf
.
#include <stdio.h>
int main() {
FILE *logfile = fopen("log.txt", "w");
if (logfile != NULL) {
fprintf(logfile, "Program started\n");
fclose(logfile);
} else {
printf("Failed to create log file\n");
}
return 0;
}
4. Setting and Managing Log Levels
By setting log levels, you can control output based on the importance of messages. Below are the roles of each level and an implementation example.
Log Level Overview
- DEBUG: Detailed debugging information
- INFO: General operational information
- WARN: Warning messages
- ERROR: Error messages
- FATAL: Critical errors
Controlling Output by Log Level
#define LOG_LEVEL_DEBUG 0
#define LOG_LEVEL_INFO 1
#define LOG_LEVEL_WARN 2
int current_log_level = LOG_LEVEL_WARN;
void log_message(int level, const char *message) {
if (level >= current_log_level) {
printf("[%d] %s\n", level, message);
}
}

5. Efficient Logging with Macros
Macros can be used to automatically include information such as file names and line numbers in logs.
#include <stdio.h>
#define LOG(level, message) printf("[%s] %s:%d - %s\n", level, __FILE__, __LINE__, message)
int main() {
LOG("INFO", "Program started");
return 0;
}
6. Logging in Multithreaded Environments
In a multithreaded environment, you must ensure thread safety to prevent conflicts when multiple threads write logs simultaneously. This can be done using pthread_mutex
.
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t log_mutex;
void log_message(const char *message) {
pthread_mutex_lock(&log_mutex);
FILE *logfile = fopen("log.txt", "a");
if (logfile != NULL) {
fprintf(logfile, "%s\n", message);
fclose(logfile);
}
pthread_mutex_unlock(&log_mutex);
}
int main() {
pthread_mutex_init(&log_mutex, NULL);
log_message("Message from thread");
pthread_mutex_destroy(&log_mutex);
return 0;
}
7. Advanced Log Management with External Libraries
Using the log4c library allows for more advanced log management.
Installing and Configuring log4c
log4c.rootCategory=INFO, R
log4c.appender.R=RollingFileAppender
log4c.appender.R.fileName=mylogfile.log
log4c.appender.R.layout=PatternLayout
log4c.appender.R.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4c Code Example
#include <log4c.h>
int main() {
log4c_init();
log4c_category_t* mycat = log4c_category_get("mycategory");
log4c_category_log(mycat, LOG4C_PRIORITY_INFO, "Program started");
log4c_fini();
return 0;
}
8. Conclusion
In this article, we covered everything from the basics to advanced techniques of logging in C. You have learned how to output logs, set log levels, and use external libraries for better log management. Proper logging practices can improve both the reliability and maintainability of your programs. We hope this guide helps you implement effective logging in your projects, boosting debugging efficiency and problem resolution.