|
21 | 21 | #include <process.h> |
22 | 22 | #include <windows.h> |
23 | 23 | #include <userenv.h> |
| 24 | +#include <direct.h> // _mkdir |
24 | 25 | #define STDERR_FD 2 |
25 | 26 | #define STDOUT_FD 1 |
26 | 27 | #define GET_PID() _getpid() |
@@ -51,6 +52,7 @@ static bool winEnableAnsiColor(int fd) { |
51 | 52 | #else |
52 | 53 | #include <unistd.h> |
53 | 54 | #include <sys/types.h> |
| 55 | +#include <sys/stat.h> |
54 | 56 | #include <pwd.h> |
55 | 57 | #define ISATTY_COLOR(fd) (isatty(fd) != 0) |
56 | 58 | #define GET_PID() getpid() |
@@ -492,19 +494,53 @@ std::shared_ptr<ZeLogger> createLogger() { |
492 | 494 | log_pattern = custom_pattern; |
493 | 495 | } |
494 | 496 |
|
| 497 | + // When logging is disabled, return a console-sink logger at level off. |
| 498 | + // This avoids any file system access (open/create) for the default case. |
| 499 | + if (!logging_enabled) { |
| 500 | + return std::make_shared<ZeLogger>(/*use_stderr=*/true, LogLevel::off, log_pattern); |
| 501 | + } |
| 502 | + |
495 | 503 | LogLevel level = logLevelFromString(log_level); |
496 | 504 | const bool log_console = getenv_tobool("ZEL_LOADER_LOG_CONSOLE"); |
497 | 505 |
|
498 | 506 | std::shared_ptr<ZeLogger> logger; |
499 | | - if (!log_console) { |
500 | | - logger = std::make_shared<ZeLogger>(full_log_file_path, level, log_pattern); |
501 | | - } else { |
| 507 | + std::string output_dest; |
| 508 | + if (log_console) { |
502 | 509 | logger = std::make_shared<ZeLogger>(/*use_stderr=*/true, level, log_pattern); |
| 510 | + output_dest = "stderr (console)"; |
| 511 | + } else { |
| 512 | + // Create the log directory only if it does not already exist. |
| 513 | +#ifdef _WIN32 |
| 514 | + DWORD attrs = GetFileAttributesA(log_directory.c_str()); |
| 515 | + if (attrs == INVALID_FILE_ATTRIBUTES || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) { |
| 516 | + _mkdir(log_directory.c_str()); |
| 517 | + } |
| 518 | +#else |
| 519 | + struct stat st{}; |
| 520 | + if (stat(log_directory.c_str(), &st) != 0 || !S_ISDIR(st.st_mode)) { |
| 521 | + mkdir(log_directory.c_str(), 0755); |
| 522 | + } |
| 523 | +#endif |
| 524 | + logger = std::make_shared<ZeLogger>(full_log_file_path, level, log_pattern); |
| 525 | + output_dest = full_log_file_path; |
503 | 526 | } |
504 | 527 |
|
505 | | - if (!logging_enabled) { |
506 | | - logger->setLevel(LogLevel::off); |
507 | | - } |
| 528 | + // Emit the active configuration as the first log message so the user can |
| 529 | + // confirm what was enabled and where output is going. |
| 530 | + std::string cfg; |
| 531 | + cfg = "Loader logging enabled:"; |
| 532 | + cfg += "\n Output : " + output_dest; |
| 533 | + cfg += "\n Level : " + log_level; |
| 534 | + cfg += "\n Pattern : " + log_pattern; |
| 535 | + if (!getenv_string("ZEL_LOADER_LOG_DIR").empty()) |
| 536 | + cfg += "\n Log dir : " + log_directory + " (ZEL_LOADER_LOG_DIR)"; |
| 537 | + if (!getenv_string("ZEL_LOADER_LOG_FILE").empty()) |
| 538 | + cfg += "\n Log file : " + loader_file + " (ZEL_LOADER_LOG_FILE, deprecated)"; |
| 539 | + if (!getenv_string("ZEL_LOADER_LOGGING_LEVEL").empty()) |
| 540 | + cfg += "\n Level src : ZEL_LOADER_LOGGING_LEVEL"; |
| 541 | + if (!getenv_string("ZEL_LOADER_LOG_PATTERN").empty()) |
| 542 | + cfg += "\n Pattern src: ZEL_LOADER_LOG_PATTERN"; |
| 543 | + logger->info(cfg); |
508 | 544 |
|
509 | 545 | return logger; |
510 | 546 | } |
|
0 commit comments