[PYTHON] Protokolldatei mit Job (Notizbuch) von Cloud Pak for Data ausgeben

Dies ist eine Methode zum Generieren eines Protokolls, wenn ein aus Notebook erstellter Job in einem Analyseprojekt von Cloud Pak for Data (im Folgenden: CP4D) ausgeführt wird.

Als Hintergrund ist es ab CP4D v3.0 nicht möglich, beliebige Protokollnachrichten in das Jobausführungsprotokoll aufzunehmen.

Details: Jobausführungsprotokoll

Wenn Sie den Job des Analyseprojekts öffnen und auf den Zeitstempel klicken, der das Ausführungsergebnis darstellt,

image.png

Das Ausführungsprotokoll wird angezeigt. Dieses Protokoll wird jedoch nur für die Python-Umgebung aufgezeichnet, wenn Job (Notebook) ausgeführt wird, und hier kann keine Protokollnachricht geschrieben werden. (Stand 11. Juni 2020 CP4D v3.0 LA) image.png

Um dieses Problem zu umgehen, habe ich eine Möglichkeit erstellt, das Protokoll aus Notebook heraus in eine Datei auszugeben und als Datenbestände für das Analyseprojekt zu registrieren.

Notebook-Beispiel zur Ausgabe einer Protokolldatei

Verwenden Sie Python Standard Logger, um Protokolle sowohl an die Konsole (Ausgabe in Notebook) als auch an die Protokolldatei auszugeben. Protokolldateien werden mit project_lib in den Datenbeständen des Analyseprojekts registriert. Informationen zu den Protokolleinstellungen finden Sie in diesem Artikel.

Schreiben Sie dies am Anfang Ihres Notizbuchs


from pytz import timezone
from datetime import datetime

#Logger-Einstellungen
logger = logging.getLogger("mylogger")
logger.setLevel(logging.DEBUG)

#Protokollformateinstellungen
def customTime(*args):
    return datetime.now(timezone('Asia/Tokyo')).timetuple()
formatter = logging.Formatter(
    fmt='%(asctime)s.%(msecs)-3d %(levelname)s : %(message)s',
    datefmt="%Y-%m-%d %H:%M:%S"
)
formatter.converter = customTime

#Handlereinstellungen für die Protokollausgabe an die Konsole(Zur Anzeige im Notebook. Level als DEBUG angegeben)
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(formatter)
logger.addHandler(sh)

#Handlereinstellungen für die Protokollausgabe in eine Datei(Zur Auftragsausführung. Die Stufe wird in INFO angegeben. Geben Sie die Protokolldatei in das aktuelle Verzeichnis aus und registrieren Sie sie später in Data Asset.)
logfilename = "mylog_" + datetime.now(timezone('Asia/Tokyo')).strftime('%Y%m%d%H%M%S') + ".log"
fh = logging.FileHandler(logfilename)
fh.setLevel(logging.INFO)
fh.setFormatter(formatter)
logger.addHandler(fh)

#Registrierungsbibliothek für Datenbestände
import io
from project_lib import Project
project = Project.access()

Dies ist ein Beispiel für die Verwendung.

try:
    logger.info('%s', 'Die Verarbeitung wurde gestartet')
    #Schreiben Sie hier den gewünschten Prozess
    
    #Protokollnachricht jederzeit ausgeben
    logger.debug('%s', 'dummy debug message')
    logger.info('%s', 'dummy info message')
    
    #Generieren Sie absichtlich einen Fehler(Teilen Sie durch 0)
    test = 1/0
    
except Exception as e:
    logger.exception('%s', str(repr(e)))
    #Exportieren Sie Protokolldateien in Data Asset(Wenn ein Fehler auftritt)
    with open(logfilename, 'rb') as z:
        data = io.BytesIO(z.read())
        project.save_data(logfilename, data, set_project_asset=True, overwrite=True)

#Exportieren Sie Protokolldateien in Data Asset(Am Ende des Normalen)
with open(logfilename, 'rb') as z:
    data = io.BytesIO(z.read())
    project.save_data(logfilename, data, set_project_asset=True, overwrite=True)

Ausführungsergebnis

Wenn ich es in Notebook ausführe, wird das Protokoll wie unten gezeigt als Ausgabe abgerufen und die Protokolldatei im Datenelement generiert.

Ausgabe zur Laufzeit in Notebook


2020-06-11 07:43:12.383 INFO :Die Verarbeitung wurde gestartet
2020-06-11 07:43:12.388 INFO : dummy info message
2020-06-11 07:43:12.389 ERROR : ZeroDivisionError('division by zero',)
Traceback (most recent call last):
  File "<ipython-input-7-0b7d7ffe66e9>", line 10, in <module>
    test = 1/0
ZeroDivisionError: division by zero

Wenn Sie die Version von Notebook speichern, einen Job erstellen und den Job ausführen, wird im Datenelement eine Protokolldatei generiert.

Die generierte Protokolldatei sieht folgendermaßen aus. image.png Ich werde es herunterladen und den Inhalt überprüfen. Die Protokolldatei hat eine INFO-Ebene, sodass sie keine DEBUG-Nachrichten enthält. image.png

Überlegungen zum Namen der Protokolldatei

Die Tatsache, dass Datenbestände mit Protokolldateien gefüllt sind, ist angesichts der ursprünglichen Verwendung von Datenbeständen nicht angenehm. Daher ist es denkbar, die Protokolldatei immer als eine zu überschreiben. Da CP4D OpenShift (Kubernates) ist, wird die Python-Umgebung von Job zur Laufzeit als Pod erstellt und verschwindet nach Abschluss. Daher wird im Fall eines Dateinamens nur die letzte Jobausführung in der Protokolldatei aufgezeichnet, und der vergangene Verlauf wird durch Überschreiben gelöscht. Daher habe ich im obigen Beispiel versucht, den Verlauf beizubehalten, indem ich den Zeitstempel in den Namen der Protokolldatei aufgenommen habe. Bitte passen Sie diesen Bereich je nach Anwendung an.

Wie oben erwähnt, ist es nicht gut, dass Datenbestände mit Protokollen gefüllt sind, aber bis es möglich wird, beliebige Protokolle in das ursprüngliche Jobprotokoll auszugeben, bleibt keine andere Wahl, als es für eine Weile zu übertreffen. Eine andere Methode besteht darin, das Protokoll in der DB-Tabelle aufzuzeichnen.

Recommended Posts

Protokolldatei mit Job (Notizbuch) von Cloud Pak for Data ausgeben
Führen Sie die API des Cloud Pak für Datenanalyseprojekts Job mit Umgebungsvariablen aus
Stellen Sie Funktionen mit Cloud Pak for Data bereit
Beseitigen Sie verstümmelte japanische Zeichen in Matplotlib-Diagrammen mit Cloud Pak for Data Notebook
Datenanalyse zur Verbesserung von POG 2 ~ Analyse mit Jupiter-Notebook ~
CSV-Ausgabe von Impulsdaten mit Raspberry Pi (CSV-Ausgabe)
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Speichern Sie Pandas-Daten mit Cloud Pak for Data (Watson Studio) im Excel-Format in Datenbeständen.
Empfehlung von Jupyter Notebook, einer Codierungsumgebung für Datenwissenschaftler
Python-Protokollierungsstandardbibliothek für die Dateiausgabe nach Protokollebene
[Aktienkursanalyse] Pandas lernen mit fiktiven Daten (002: Protokollausgabe)
Verbessertes Lernen 7 Protokollieren Sie die Ausgabe von Lerndaten
Geben Sie csv mit unterschiedlicher Anzahl von Ziffern für jede Spalte mit numpy aus
Ausgabe in eine CSV-Datei mit Python
[Cloud102] # 3-1 Bonus für AML Studio NOTEBOOK
Unit Test Log Ausgabe mit Python
Speichersparende Matrixkonvertierung von Protokolldaten
Hinweise zur Eingabe / Ausgabe von Python-Dateien
4. Nacht der Schleife mit für
CSV-Ausgabe von Pulsdaten mit Raspberry Pi (Analogeingang mit Python prüfen)
Grundeinstellung des Jupyter-Notizbuchs für Vim-Liebhaber ・ Beenden mit jj (jupyter-vim-Bindung)
Beispiel für den Betrieb eines Cloud Pak for Data-Objekts in Python (WML-Client, project_lib)