summaryrefslogtreecommitdiffstats
path: root/vespalog
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-01-13 10:10:50 +0000
committerArne Juul <arnej@yahooinc.com>2023-01-13 12:32:55 +0000
commit9e4fc3e194be70c641a8acc09dbe08998ff9c86a (patch)
tree96db0f243d6aa4c4cd3cd8180a1c5340f9685e58 /vespalog
parent6ea555de57ad11bae44e7f9abca4d2b06d3863ae (diff)
make a duplicate of the file descriptor in target
* lets us log a little more if stderr is later redirected to /dev/null
Diffstat (limited to 'vespalog')
-rw-r--r--vespalog/src/vespa/log/log-target-fd.cpp8
-rw-r--r--vespalog/src/vespa/log/log-target-fd.h8
-rw-r--r--vespalog/src/vespa/log/log-target.cpp14
3 files changed, 15 insertions, 15 deletions
diff --git a/vespalog/src/vespa/log/log-target-fd.cpp b/vespalog/src/vespa/log/log-target-fd.cpp
index cb1b2e792b4..a740d3fef06 100644
--- a/vespalog/src/vespa/log/log-target-fd.cpp
+++ b/vespalog/src/vespa/log/log-target-fd.cpp
@@ -11,14 +11,14 @@ LOG_SETUP(".log");
namespace ns_log {
-LogTargetFd::LogTargetFd(const char *target)
+LogTargetFd::LogTargetFd(int fd_spec, const char *target)
: LogTarget(target),
_fd(-1), _istty(false)
{
- if (strncmp(target, "fd:", 3) != 0) {
+ _fd = dup(fd_spec);
+ if (_fd == -1) {
throwInvalid("Bad target for LogTargetFd: '%s'", target);
}
- _fd = strtol(target + 3, NULL, 0);
if (isatty(_fd) == 1) {
_istty = true;
}
@@ -26,7 +26,7 @@ LogTargetFd::LogTargetFd(const char *target)
LogTargetFd::~LogTargetFd()
{
- // Must not close _fd, we did not open it!
+ close(_fd);
}
diff --git a/vespalog/src/vespa/log/log-target-fd.h b/vespalog/src/vespa/log/log-target-fd.h
index fa8df8ce8ed..85857c206b5 100644
--- a/vespalog/src/vespa/log/log-target-fd.h
+++ b/vespalog/src/vespa/log/log-target-fd.h
@@ -9,12 +9,12 @@ class LogTargetFd : public LogTarget {
private:
int _fd;
bool _istty;
- LogTargetFd();
- LogTargetFd(const LogTargetFd&);
- LogTargetFd& operator = (const LogTargetFd);
+ LogTargetFd() = delete;
+ LogTargetFd(const LogTargetFd&) = delete;
+ LogTargetFd& operator= (const LogTargetFd) = delete;
public:
- explicit LogTargetFd(const char *target);
+ LogTargetFd(int fd_spec, const char *target);
int write(const char *buf, int len) override;
~LogTargetFd();
bool makeHumanReadable() const override { return _istty; }
diff --git a/vespalog/src/vespa/log/log-target.cpp b/vespalog/src/vespa/log/log-target.cpp
index 4ac037354e1..26f064634ca 100644
--- a/vespalog/src/vespa/log/log-target.cpp
+++ b/vespalog/src/vespa/log/log-target.cpp
@@ -25,21 +25,21 @@ LogTarget *
LogTarget::defaultTarget()
{
// Note! This function cannot LOG().
- return new LogTargetFd("fd:2");
+ return new LogTargetFd(2, "fd:2");
}
LogTarget *
LogTarget::makeTarget(const char *const target)
{
- LogTarget *res = NULL;
if (strncmp(target, "fd:", 3) == 0) {
- res = new LogTargetFd(target);
+ int fd_spec = strtol(target + 3, NULL, 0);
+ if (fd_spec > 0) {
+ return new LogTargetFd(fd_spec, target);
+ }
} else if (strncmp(target, "file:", 5) == 0) {
- res = new LogTargetFile(target);
- } else {
- throwInvalid("Log target '%s' is invalid.", target);
+ return new LogTargetFile(target);
}
- return res;
+ throwInvalid("Log target '%s' is invalid.", target);
}