Skip to content

Commit 2233385

Browse files
committed
Minor cleanup of logging issues
+ Removed references in mako files to old logger + Removed some dead code + Fixed recursive log directory creation corner case Signed-off-by: Russell McGuire <russell.w.mcguire@intel.com>
1 parent dfe0964 commit 2233385

4 files changed

Lines changed: 65 additions & 38 deletions

File tree

scripts/templates/ze_loader_internal.h.mako

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ from templates import helper as th
3232
#include "zer_ldrddi.h"
3333

3434
#include "loader/ze_loader.h"
35-
#include "../utils/logging.h"
35+
#include "../utils/ze_logger.h"
3636
#include "source/lib/error_state.h"
3737
namespace loader
3838
{
@@ -138,7 +138,7 @@ namespace loader
138138
bool instrumentationEnabled = false;
139139
bool pciOrderingRequested = false;
140140
dditable_t tracing_dditable = {};
141-
std::shared_ptr<Logger> zel_logger;
141+
std::shared_ptr<ZeLogger> zel_logger;
142142
ze_driver_handle_t defaultZerDriverHandle = nullptr;
143143
};
144144

source/loader/ze_loader_api.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,6 @@ zelLoaderGetContext() {
5959
return loader::context;
6060
}
6161

62-
///////////////////////////////////////////////////////////////////////////////
63-
/// @brief Get the loader's shared logger instance.
64-
///
65-
ZE_DLLEXPORT std::shared_ptr<loader::ZeLogger> *ZE_APICALL
66-
zelLoaderGetLogger() {
67-
if (loader::context == nullptr)
68-
return nullptr;
69-
auto &log = loader::context->zel_logger;
70-
if (!log)
71-
return nullptr;
72-
return &log;
73-
}
74-
7562
///////////////////////////////////////////////////////////////////////////////
7663
/// @brief Internal function for Setting the ZE ddi table for the Tracing Layer.
7764
///

source/loader/ze_loader_api.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,6 @@ zeLoaderGetTracingHandle();
6565
ZE_DLLEXPORT loader::context_t *ZE_APICALL
6666
zelLoaderGetContext();
6767

68-
///////////////////////////////////////////////////////////////////////////////
69-
/// @brief Get the loader's shared logger instance.
70-
/// Returns nullptr if the loader context is not yet initialized.
71-
/// Callers (e.g. the validation layer) should adopt this logger
72-
/// instead of creating their own to share a single file handle and mutex.
73-
///
74-
/// @returns
75-
/// - ::Pointer to the shared ZeLogger, or nullptr
76-
ZE_DLLEXPORT std::shared_ptr<loader::ZeLogger> *ZE_APICALL
77-
zelLoaderGetLogger();
78-
79-
8068
///////////////////////////////////////////////////////////////////////////////
8169
/// @brief Exported function for getting version
8270
///

source/utils/ze_logger.cpp

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
#include "ze_logger.h"
1010
#include "ze_util.h"
1111

12+
#include <cerrno>
1213
#include <chrono>
14+
#include <cstdio>
1315
#include <ctime>
1416
#include <iomanip>
1517
#include <iostream>
@@ -101,6 +103,24 @@ const char *levelColor(LogLevel l) {
101103
}
102104
}
103105

106+
// Thread-safe, portable errno-to-string conversion.
107+
// MSVC deprecates strerror() in favour of strerror_s(); POSIX provides strerror_r().
108+
static std::string errnoToString(int err) {
109+
char buf[256];
110+
#ifdef _WIN32
111+
strerror_s(buf, sizeof(buf), err);
112+
return buf;
113+
#elif defined(_GNU_SOURCE)
114+
// GNU strerror_r returns char* (may or may not use buf)
115+
const char *result = strerror_r(err, buf, sizeof(buf));
116+
return result ? result : buf;
117+
#else
118+
// XSI-compliant strerror_r returns int
119+
strerror_r(err, buf, sizeof(buf));
120+
return buf;
121+
#endif
122+
}
123+
104124
} // anonymous namespace
105125

106126
// ---------------------------------------------------------------------------
@@ -158,9 +178,10 @@ LogLevel logLevelFromString(const std::string &s) {
158178
if (s == "trace") return LogLevel::trace;
159179
if (s == "debug") return LogLevel::debug;
160180
if (s == "info") return LogLevel::info;
161-
if (s == "warn") return LogLevel::warn;
162-
if (s == "error") return LogLevel::err;
163-
if (s == "critical") return LogLevel::critical;
181+
if (s == "warn" || s == "warning") return LogLevel::warn;
182+
if (s == "err" || s == "error") return LogLevel::err;
183+
if (s == "crit" || s == "critical") return LogLevel::critical;
184+
if (s == "off") return LogLevel::off;
164185
return LogLevel::warn; // default
165186
}
166187

@@ -205,7 +226,7 @@ void ZeLogger::flush() {
205226
// Default pattern tokens:
206227
// %Y-%m-%d %H:%M:%S.%e — timestamp with milliseconds
207228
// %t — thread id (cached thread_local, STB_LOCAL — safe for dlclose)
208-
// %P — process id (cached at construction)
229+
// %P — process id
209230
// %^%l%$ — level label (with color when tty)
210231
// %v — message
211232
//
@@ -516,16 +537,47 @@ std::shared_ptr<ZeLogger> createLogger(const std::string &caller) {
516537
logger = std::make_shared<ZeLogger>(/*use_stderr=*/true, level, log_pattern);
517538
output_dest = "stderr (console)";
518539
} else {
519-
// Create the log directory only if it does not already exist.
540+
// Create the full directory path (equivalent to mkdir -p).
520541
#ifdef _WIN32
521-
DWORD attrs = GetFileAttributesA(log_directory.c_str());
522-
if (attrs == INVALID_FILE_ATTRIBUTES || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) {
523-
_mkdir(log_directory.c_str());
542+
// Walk each component and create it if missing.
543+
for (std::size_t pos = 0; pos <= log_directory.size(); ++pos) {
544+
if (pos == log_directory.size() ||
545+
log_directory[pos] == '\\' || log_directory[pos] == '/') {
546+
if (pos == 0) continue;
547+
std::string partial = log_directory.substr(0, pos);
548+
DWORD attrs = GetFileAttributesA(partial.c_str());
549+
if (attrs == INVALID_FILE_ATTRIBUTES) {
550+
if (_mkdir(partial.c_str()) != 0 && errno != EEXIST) {
551+
std::cerr << "ze_logger: Failed to create log directory '"
552+
<< partial << "': " << errnoToString(errno) << "\n";
553+
return std::make_shared<ZeLogger>();
554+
}
555+
} else if (!(attrs & FILE_ATTRIBUTE_DIRECTORY)) {
556+
std::cerr << "ze_logger: Log directory path component '"
557+
<< partial << "' exists but is not a directory\n";
558+
return std::make_shared<ZeLogger>();
559+
}
560+
}
524561
}
525562
#else
526-
struct stat st{};
527-
if (stat(log_directory.c_str(), &st) != 0 || !S_ISDIR(st.st_mode)) {
528-
mkdir(log_directory.c_str(), 0755);
563+
// Walk each component and create it if missing.
564+
for (std::size_t pos = 0; pos <= log_directory.size(); ++pos) {
565+
if (pos == log_directory.size() || log_directory[pos] == '/') {
566+
if (pos == 0) continue;
567+
std::string partial = log_directory.substr(0, pos);
568+
struct stat st{};
569+
if (stat(partial.c_str(), &st) != 0) {
570+
if (mkdir(partial.c_str(), 0755) != 0 && errno != EEXIST) {
571+
std::cerr << "ze_logger: Failed to create log directory '"
572+
<< partial << "': " << errnoToString(errno) << "\n";
573+
return std::make_shared<ZeLogger>();
574+
}
575+
} else if (!S_ISDIR(st.st_mode)) {
576+
std::cerr << "ze_logger: Log directory path component '"
577+
<< partial << "' exists but is not a directory\n";
578+
return std::make_shared<ZeLogger>();
579+
}
580+
}
529581
}
530582
#endif
531583
logger = std::make_shared<ZeLogger>(full_log_file_path, level, log_pattern);

0 commit comments

Comments
 (0)