Alex Ilyin
06/06/2024, 8:50 PMMarvin
06/06/2024, 8:50 PMpython
import logging
from logging.handlers import SMTPHandler
class EmailHandler(SMTPHandler):
def emit(self, record):
try:
# Ensure the record contains a fully-formatted log entry
message = self.format(record)
# Sending an email with the formatted log message
super().emit(record)
except Exception as e:
self.handleError(record)
# Configuration for the email handler
email_handler = EmailHandler(
mailhost=("<http://smtp.example.com|smtp.example.com>", 587),
fromaddr="<mailto:myemail@example.com|myemail@example.com>",
toaddrs=["<mailto:recipient@example.com|recipient@example.com>"],
subject="Prefect Logger Notification",
credentials=("<mailto:myemail@example.com|myemail@example.com>", "password"),
secure=()
)
email_handler.setLevel(logging.ERROR)
### Step 2: Integrate Custom Handler with Prefect Logger
1. Update your Prefect configuration file (usually ~/.prefect/logging.yml
) to include your custom email handler. Below is a simplified example:
yaml
version: 1
formatters:
standard:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
formatter: standard
level: DEBUG
stream: <ext://sys.stdout>
email:
(): path.to.your.module_with_email_handler.EmailHandler
mailhost: (your_smtp_server, port)
fromaddr: your_email
toaddrs: [recipient_emails]
subject: '[Prefect] %(levelname)s: %(message)s'
credentials: (email_account, password)
secure: []
loggers:
prefect:
level: DEBUG
handlers: [console, email]
root:
level: DEBUG
handlers: [console, email]
### Step 3: Verify and Run
- Restart your Prefect services to load the new logging configuration.
### References
1. Prefect Logging Guide
2. Example of Custom Logger
This should help you integrate an email handler with your Prefect logger. Feel free to modify the configuration according to your requirements.Alex Ilyin
06/06/2024, 9:07 PMMarvin
06/06/2024, 9:07 PMlogging.yml
configuration file to include these details in the log format.
Here's an example configuration illustrating how to achieve this:
### Example logging.yml
Configuration
yaml
version: 1
formatters:
standard:
format: '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: standard
stream: <ext://sys.stdout>
file:
class: logging.FileHandler
level: DEBUG
formatter: standard
filename: 'prefect_logs.log'
loggers:
prefect:
level: DEBUG
handlers: [console, file]
propagate: no
root:
level: DEBUG
handlers: [console, file]
### Explanation
- formatters: Defines the format of the log messages. The format '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
includes the timestamp, logger name, log level, filename, line number, and log message.
- handlers: Specifies where the logs should be written. Here, logs are output to the console and a file.
- loggers: Defines the loggers and their configurations. The prefect
logger is set up here.
- root: Configures the root logger to ensure all logs follow this configuration.
Save this configuration in your logging.yml
file and place it where Prefect can find it, for example, in ~/.prefect/logging.yml
.
### Applying the Configuration
Ensure that Prefect uses this custom configuration. You might need to set an environment variable or place the file in the default location according to your Prefect setup.
### References
1. Prefect Logging Guide
Feel free to adapt this configuration to fit your specific requirements.Alex Ilyin
06/06/2024, 9:17 PMMarvin
06/06/2024, 9:17 PMlogging.yml
file is correctly utilized when deploying Prefect flows, follow these steps:
### 1. Default Location
Place the logging.yml
file in the default location:
~/.prefect/logging.yml
### 2. Custom Location
If you prefer a custom location, you can also set an environment variable to point to your custom logging.yml
file. For example:
sh
export PREFECT_LOGGING_CONFIG=/path/to/your/logging.yml
### 3. Include in Deployment Infrastructure
Ensure the logging.yml
file is included in your deployment environment. This might mean copying the file to your Docker container, Kubernetes pod, or any other environment where your Prefect flows run.
### 4. Usage in Code
You can also programmatically specify a custom logging configuration in your deployment scripts or flow definitions. For example:
python
import os
import prefect
# Ensure Prefect uses the custom logging config
os.environ["PREFECT_LOGGING_CONFIG"] = "/path/to/your/logging.yml"
### Documentation References
1. Prefect Logging Guide
2. Deployment Configuration
By following these steps, you can ensure your custom logging configuration is respected during Prefect flow deployments.Alex Ilyin
06/06/2024, 10:30 PMsocket.gaierror: [Errno 8] nodename nor servname provided, or not known
when trying to set an email handler in logging.ymlMarvin
06/06/2024, 10:30 PMsocket.gaierror: [Errno 8] nodename nor servname provided, or not known
error typically indicates that the hostname or port number specified for the mail server in your logging.yml
configuration is incorrect or cannot be resolved.
Here are some steps to troubleshoot and resolve this issue:
### 1. Verify Mail Server Details
Ensure the mailhost
entry in your logging.yml
file is correctly specified with the correct hostname and port number. Here's an example configuration:
yaml
version: 1
formatters:
standard:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
formatter: standard
level: DEBUG
stream: <ext://sys.stdout>
email:
class: logging.handlers.SMTPHandler
level: ERROR
mailhost: ("<http://smtp.example.com|smtp.example.com>", 587) # Ensure this is correct
fromaddr: "<mailto:myemail@example.com|myemail@example.com>"
toaddrs: ["<mailto:recipient@example.com|recipient@example.com>"]
subject: "Prefect Logger Notification"
credentials: ("<mailto:myemail@example.com|myemail@example.com>", "password")
secure: []
loggers:
prefect:
level: DEBUG
handlers: [console, email]
root:
level: DEBUG
handlers: [console, email]
### 2. Check DNS Resolution
Ensure your machine can resolve the hostname. You can test this using command-line tools like ping
or `nslookup`:
sh
ping <http://smtp.example.com|smtp.example.com>
nslookup <http://smtp.example.com|smtp.example.com>
### 3. Check Network Connectivity
Ensure that your machine has network connectivity to the mail server and that no firewalls or network policies are blocking the connection.
### 4. Mail Server Configuration
Ensure that the mail server is configured to accept connections on the specified port and that the credentials provided are correct.
### 5. Use IP Address
As a temporary workaround to verify correctness, try using the mail server's IP address in the mailhost
configuration instead of the hostname:
yaml
mailhost: ("192.168.1.1", 587)
If you continue experiencing issues, it might be helpful to look at the complete traceback to identify where the problem lies or consult your mail server's documentation for additional troubleshooting steps.