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.
Wenn Sie den Job des Analyseprojekts öffnen und auf den Zeitstempel klicken, der das Ausführungsergebnis darstellt,
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)
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.
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)
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. Ich werde es herunterladen und den Inhalt überprüfen. Die Protokolldatei hat eine INFO-Ebene, sodass sie keine DEBUG-Nachrichten enthält.
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.