---
name: "pmopenlog"
section: "3"
platform: "linux"
package: "libpcp3-dev"
version: "4.3.2+really4.3.1-0.1"
release: "Debian 10 (Buster)"
platforms: ["linux"]
url: "https://new.carta.tech/pmOpenLog"
---

# pmopenlog(3)

create a log file for diagnostics and debug output

Part of [pmOpenLog(3)](/pmOpenLog/3.md).

## NAME

**pmOpenLog** - create a log file for diagnostics and debug output

## C SYNOPSIS

**#include \<pcp/pmapi.h\>**

**FILE \*pmOpenLog(const char \****progname***, const char \****logname***, FILE \****oldstream***, int \****status***);**

**cc ... -lpcp**

## DESCRIPTION

**pmOpenLog** reassigns the standard I/O stream *oldstream* (normally **stderr**) to be associated with the file *logname*. If *logname* is not **"-"** and already exists, it will be removed and recreated if possible (to ensure correct ownership and permissions from the caller to **pmOpenLog**).

As a special case, if *logname* is "**-**" then no removal or reopening is performed and the function simply sets *status* to **1** and returns *oldstream*. This is useful when the caller wants diagnostics on *oldstream* stream (normally **stderr**) rather than a file, e.g. **pmlogger -l-** or **pmcd -f -l-**. Logging to **stderr** is also useful for PMDAs in a containerized environment where it is beneficial for all PMDA logs to be written to **pmcd**'s **stderr** stream (and thus to a single destination), whether that is a file such as **pmcd.log** or the original  stream inherited from the shell.

On return, the function value is the standard I/O stream, possibly replacing *oldstream*. In the event of an error, the return value will be *oldstream* unchanged and *status* will be **0**.

For success, *status* is **1**, and a standard preamble is written to *logname* **Log for** *progname* **on** *hostname* **started** *date and time*\
 and an [**atexit**(3)](/atexit/3.md) handler is installed to write the postscript message to *logname* **Log finished** *date and time*\
 when the processes exits.

*progname* is only used to annotate messages.

## SEE ALSO

[**atexit**(3)](/atexit/3.md) and [**freopen**(3)](/freopen/3.md).
