Coverage Report

Created: 2026-06-30 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/include/plugin/wasi_logging/env.h
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
3
4
// BUILTIN-PLUGIN: Temporarily move the wasi-logging plugin sources here until
5
// the new plugin architecture is ready in 0.15.0.
6
7
#pragma once
8
9
#include "common/hexstr.h"
10
#include "common/spdlog.h"
11
12
#include <spdlog/sinks/basic_file_sink.h>
13
#include <spdlog/sinks/stdout_color_sinks.h>
14
#include <spdlog/spdlog.h>
15
16
#include <limits>
17
#include <memory>
18
#include <mutex>
19
#include <random>
20
#include <string>
21
#include <string_view>
22
#include <unordered_set>
23
24
namespace WasmEdge {
25
namespace Host {
26
namespace WASILogging {
27
28
class LogEnv {
29
public:
30
0
  LogEnv() noexcept {
31
0
    using namespace std::literals;
32
    // Get the stdout and stderr logger.
33
0
    StdoutLogger = spdlog::get("wasi_logging_stdout"s);
34
0
    if (!StdoutLogger) {
35
0
      StdoutLogger = spdlog::stdout_color_mt("wasi_logging_stdout"s);
36
0
      StdoutLogger->set_level(spdlog::level::trace);
37
0
      StdoutLogger->set_pattern(DefFormat);
38
0
    }
39
0
    StderrLogger = spdlog::get("wasi_logging_stderr"s);
40
0
    if (!StderrLogger) {
41
0
      StderrLogger = spdlog::stderr_color_mt("wasi_logging_stderr"s);
42
0
      StderrLogger->set_level(spdlog::level::trace);
43
0
      StderrLogger->set_pattern(DefFormat);
44
0
    }
45
46
0
    std::random_device RandDev;
47
0
    std::mt19937 RandGen(RandDev());
48
0
    std::uniform_int_distribution<uint64_t> RandDist(
49
0
        0, std::numeric_limits<uint64_t>::max());
50
51
0
    std::unique_lock Lock(Mutex);
52
0
    do {
53
0
      InstanceID = RandDist(RandGen);
54
0
    } while (RegisteredID.find(InstanceID) != RegisteredID.cend());
55
0
    LogRegName = "wasi_logging_file_" + convertUIntToHexStr(InstanceID);
56
0
    RegisteredID.insert(InstanceID);
57
0
  }
58
59
0
  ~LogEnv() noexcept {
60
0
    std::unique_lock Lock(Mutex);
61
    // Drop the file logger by its registered name; never LogFileName, which is
62
    // empty until a file is set and would reset the unnamed default logger.
63
0
    if (FileLogger) {
64
0
      spdlog::drop(LogRegName);
65
0
    }
66
0
    RegisteredID.erase(InstanceID);
67
0
  }
68
69
0
  std::string_view getLogFileName() const noexcept { return LogFileName; }
70
0
  void setLogFileName(std::string_view Name) noexcept {
71
0
    LogFileName = std::string(Name);
72
0
  }
73
74
0
  const std::string &getLogRegName() const noexcept { return LogRegName; }
75
76
0
  uint64_t getInstanceID() const noexcept { return InstanceID; }
77
78
  static std::mutex Mutex;
79
  static std::unordered_set<uint64_t> RegisteredID;
80
  static const std::string DefFormat;
81
  std::shared_ptr<spdlog::logger> StdoutLogger;
82
  std::shared_ptr<spdlog::logger> StderrLogger;
83
  std::shared_ptr<spdlog::logger> FileLogger;
84
85
private:
86
  std::string LogFileName;
87
  std::string LogRegName;
88
  uint64_t InstanceID;
89
};
90
91
} // namespace WASILogging
92
} // namespace Host
93
} // namespace WasmEdge