Skip to content

Commit 43f1188

Browse files
authored
The pyntc rotating file handler is now opt-in (#383)
* The pyntc rotating file handler is now opt-in via the `PYNTC_LOG_FILE` environment variable. When unset, no log file is created. When set, its value is used as the log file path, and the handler is registered only once per logger to avoid duplicate entries on repeated `get_log` calls.
1 parent 8b2d4de commit 43f1188

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

changes/383.changed

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
The pyntc rotating file handler is now opt-in via the `PYNTC_LOG_FILE` environment variable. When unset, no log file is created. When set, its value is used as the log file path, and the handler is registered only once per logger to avoid duplicate entries on repeated `get_log` calls.

docs/user/lib_getting_started.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,23 @@ Full workflow example:
342342
>>>
343343
```
344344

345+
# Logging
346+
347+
pyntc reads several environment variables to configure logging. None of them are required; all are read at runtime.
348+
349+
| Variable | Description |
350+
| --- | --- |
351+
| `PYNTC_LOG_LEVEL` | Log level for the `pyntc` logger (e.g. `debug`, `info`, `warning`). Defaults to `info`. |
352+
| `PYNTC_DEBUG` | When set to any non-empty value, forces the log level to `DEBUG` and switches to a more verbose log format. |
353+
| `PYNTC_LOG_FILE` | Path to a file that pyntc should log to. When set, a `RotatingFileHandler` (2000 byte rotation) is attached to the logger using this path. When unset, no file handler is attached; log records still propagate to the root logger configured by `logging.basicConfig` (called from `pyntc.log.init` during device initialization) or by the calling application. |
354+
355+
Example:
356+
357+
```bash
358+
export PYNTC_LOG_FILE=/var/log/pyntc.log
359+
export PYNTC_LOG_LEVEL=debug
360+
```
361+
345362
#### Cisco IOS Install Mode Option
346363

347364
New in 0.15 there is support for [Install Mode](https://content.cisco.com/chapter.sjs?uri=/searchable/chapter/c/en/us/td/docs/switches/lan/Denali_16-1/ConfigExamples_Technotes/Config_Examples/Misc/qos/m_install_vs_bundle.html.xml) upgrades. To execute this there is an option (defaults to False) to run install mode. **file_copy must be executed before install_os**

pyntc/log.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,25 @@
1717
def get_log(name=None):
1818
"""Get log namespace and creates logger and rotating file handler.
1919
20+
A :class:`RotatingFileHandler` is attached if the ``PYNTC_LOG_FILE``
21+
environment variable is set, in which case its value is used as the log
22+
file path.
23+
2024
Args:
2125
name (str, optional): Sublogger name. Defaults to None.
2226
2327
Returns:
2428
(logger): Return a logger instance in the :data:`APP` namespace.
2529
"""
2630
logger_name = f"{APP}.{name}" if name else APP
27-
# file handler
28-
handler = RotatingFileHandler(f"{logger_name}.log", maxBytes=2000)
2931
_logger = logging.getLogger(logger_name)
30-
_logger.addHandler(handler)
32+
33+
log_file = os.environ.get("PYNTC_LOG_FILE")
34+
if log_file and not any(
35+
isinstance(h, RotatingFileHandler) and getattr(h, "baseFilename", None) == os.path.abspath(log_file)
36+
for h in _logger.handlers
37+
):
38+
_logger.addHandler(RotatingFileHandler(log_file, maxBytes=2000))
3139

3240
return _logger
3341

0 commit comments

Comments
 (0)