تصدير البيانات من مساحة عمل Log Analytics إلى حساب تخزين باستخدام Logic Apps

توضح هذه المقالة طريقة لاستخدام Azure Logic Apps للاستعلام عن البيانات من مساحة عمل Log Analytics في Azure Monitor وإرسالها إلى Azure Storage. استخدم هذه العملية عندما تحتاج إلى تصدير بيانات سجلات Azure Monitor لسيناريوهات التدقيق والتوافق أو للسماح لخدمة أخرى باسترداد هذه البيانات.

أساليب تصدير أخرى

يصف الأسلوب الذي تمت مناقشته في هذه المقالة تصدير مجدول من استعلام سجل باستخدام تطبيق منطقي. تتضمن الخيارات الأخرى لتصدير البيانات لسيناريوهات معينة ما يلي:

نظرة عامة

يستخدم هذا الإجراء موصل سجلات Azure Monitor، والذي يتيح لك تشغيل استعلام سجل من تطبيق منطقي واستخدام مخرجاته في إجراءات أخرى في سير العمل. يتم استخدام موصل Azure Blob Storage في هذا الإجراء لإرسال إخراج الاستعلام إلى التخزين.

Screenshot that shows a Logic Apps overview.

عند تصدير البيانات من مساحة عمل Log Analytics، حدد كمية البيانات التي تتم معالجتها بواسطة سير عمل Logic Apps. قم بتصفية بيانات السجل وتجميعها في الاستعلام لتقليل البيانات المطلوبة. على سبيل المثال، إذا كنت بحاجة إلى تصدير أحداث تسجيل الدخول، قم بتصفية الأحداث المطلوبة وقم بتوقع الحقول المطلوبة فقط. على سبيل المثال:

SecurityEvent
| where EventID == 4624 or EventID == 4625
| project TimeGenerated , Account , AccountType , Computer

عند تصدير البيانات على جدول زمني، استخدم الدالة ingestion_time() في الاستعلام للتأكد من عدم تفويت البيانات المتأخرة. إذا تأخرت البيانات بسبب مشكلات في الشبكة أو النظام الأساسي، فإن استخدام وقت الاستيعاب يضمن تضمين البيانات في تنفيذ Logic Apps التالي. على سبيل المثال، راجع الخطوة "إضافة إجراء Azure Monitor Logs" في قسم إجراء Logic Apps.

المتطلبات الأساسية

يجب إكمال المتطلبات الأساسية التالية قبل بدء هذا الإجراء:

  • مساحة عمل Log Analytics: يجب أن يكون لدى المستخدم الذي ينشئ تطبيق المنطق إذن قراءة على الأقل لمساحة العمل.
  • حساب التخزين: لا يجب أن يكون حساب التخزين في نفس الاشتراك مثل مساحة عمل Log Analytics. يجب أن يكون لدى المستخدم الذي قام بإنشاء التطبيق المنطقي إذن كتابة إلى حساب التخزين.

حدود الموصل

مساحة عمل Log Analytics واستعلامات السجل في Azure Monitor هي خدمات متعددة المستأجرين تتضمن حدودا لحماية العملاء وعزلهم والحفاظ على جودة الخدمة. عند الاستعلام عن كمية كبيرة من البيانات، ضع في اعتبارك الحدود التالية، والتي يمكن أن تؤثر على كيفية تكوين تكرار Logic Apps واستعلام السجل الخاص بك:

  • لا يمكن أن ترجع استعلامات السجل أكثر من 500,000 صف.
  • لا يمكن أن ترجع استعلامات السجل أكثر من 64,000,000 بايت.
  • لا يمكن تشغيل استعلامات السجل لأكثر من 10 دقائق.
  • يقتصر موصل Log Analytics على 100 استدعاء في الدقيقة.

إجراء Logic Apps

ترشدك الأقسام التالية خلال الإجراء.

إنشاء حاوية في حساب التخزين

استخدم الإجراء في إنشاء حاوية لإضافة حاوية إلى حساب التخزين الخاص بك للاحتفاظ بالبيانات المصدرة. الاسم المستخدم للحاوية في هذه المقالة هو loganalytics-البيانات،ولكن يمكنك استخدام أي اسم.

إنشاء سير عمل تطبيق منطقي

  1. انتقل إلى تطبيقات المنطق في مدخل Microsoft Azure وحدد إضافة. حدد الاشتراك ومجموعة الموارد والمنطقة لتخزين تطبيق المنطق الجديد. ثم امنحه اسما فريدا. يمكنك تشغيل إعداد Log Analytics لجمع معلومات حول بيانات وقت التشغيل والأحداث كما هو موضح في إعداد سجلات Azure Monitor وجمع بيانات التشخيص ل Azure Logic Apps. هذا الإعداد غير مطلوب لاستخدام موصل سجلات المراقبة في Azure.

    Screenshot that shows creating a logic app.

  2. حدد مراجعة + إنشاء، ثم حدد إنشاء. بعد الانتهاء من النشر، حدد Go to resource لفتح Logic Apps المصمم.

إنشاء مشغل لسير العمل

ضمن البدء بمشغل شائع، حدد «تكرار». ينشئ هذا الإعداد سير عمل تطبيق منطقي يتم تشغيله تلقائيا في فاصل زمني منتظم. في مربع Frequency للإجراء، حدد Day. في المربع الفاصل الزمني ، أدخل 1 لتشغيل سير العمل مرة واحدة في اليوم.

Screenshot that shows a Recurrence action.

إضافة إجراء Azure Monitor Logs

يتيح لك إجراء Azure Monitor Logs تحديد الاستعلام المطلوب تشغيله. تم تحسين استعلام السجل المستخدم في هذا المثال للتكرار كل ساعة. وهو يجمع البيانات التي تم استيعابها لوقت التنفيذ المحدد. على سبيل المثال، إذا تم تشغيل سير العمل في الساعة 4:35، فسوف يكون النطاق الزمني من 3:00 إلى 4:00. إذا قمت بتغيير تطبيق المنطق لتشغيله بتردد مختلف، فستحتاج إلى تغيير الاستعلام أيضا. على سبيل المثال، إذا قمت بتعيين التكرار للتشغيل يوميا، يمكنك تعيين startTime في الاستعلام إلى startofday(make_datetime(year,month,day,0,0)).

تتم مطالبتك بتحديد مستأجر لمنح حق الوصول إلى مساحة عمل Log Analytics باستخدام الحساب الذي سيستخدمه سير العمل لتشغيل الاستعلام.

  1. حدد « + خطوة جديدة» لإضافة إجراء يتم تشغيله بعد إجراء التكرار. ضمن اختيار إجراء، أدخل azure monitor. ثم حدد Azure Monitor Logs.

    Screenshot that shows an Azure Monitor Logs action.

  2. حدد Azure Log Analytics - تشغيل الاستعلام وسرد النتائج.

    Screenshot that shows Azure Monitor Logs is highlighted under Choose an action.

  3. حدد «اشتراك» ومجموعة الموارد لمساحة عمل Log Analytics. حدد مساحة عمل Log Analytics لنوع المورد. ثم حدد اسم مساحة العمل ضمن اسم المورد.

  4. أضف استعلام السجل التالي إلى نافذة الاستعلام :

    let dt = now();
    let year = datetime_part('year', dt);
    let month = datetime_part('month', dt);
    let day = datetime_part('day', dt);
     let hour = datetime_part('hour', dt);
    let startTime = make_datetime(year,month,day,hour,0)-1h;
    let endTime = startTime + 1h - 1tick;
    AzureActivity
    | where ingestion_time() between(startTime .. endTime)
    | project 
        TimeGenerated,
        BlobTime = startTime, 
        OperationName ,
        OperationNameValue ,
        Level ,
        ActivityStatus ,
        ResourceGroup ,
        SubscriptionId ,
        Category ,
        EventSubmissionTimestamp ,
        ClientIpAddress = parse_json(HTTPRequest).clientIpAddress ,
        ResourceId = _ResourceId 
    
  5. يحددنطاق الوقت السجلات التي سيتم تضمينها في الاستعلام استنادًا إلى العمود TimeGenerated. يجب أن تكون القيمة أكبر من النطاق الزمني المحدد في الاستعلام. نظرا لأن هذا الاستعلام لا يستخدم العمود TimeGenerated ، لا يتوفر الخيار تعيين في الاستعلام . لمزيد من المعلومات حول النطاق الزمني، راجع نطاق الاستعلام. قم بتحديد «آخر 4 ساعات»للنطاق الزمني. يضمن هذا الإعداد تضمين أي سجلات ذات وقت استيعاب أكبر من TimeGenerated في النتائج.

    Screenshot that shows the settings for the new Azure Monitor Logs action named Run query and visualize results.

إضافة إجراء تحليل JSON (اختياري)

يتم تنسيق الإخراج من إجراء الاستعلام تشغيل ونتائج القائمة في JSON. يمكنك تحليل هذه البيانات ومعالجتها كجزء من التحضير لإجراء الإنشاء .

كما يمكنك توفير مخطط JSON الذي يصف الحمولة التي تتوقع تلقيها. المصمم يوزع محتوى JSON باستخدام هذا المخطط ويقوم بإنشاء رموز مميزة سهلة الاستخدام تمثل الخصائص في محتوى JSON المتعلق بك. يمكنك بعد ذلك الرجوع بسهولة واستخدام هذه الخصائص في مختلف أجزاء سير العمل لـ Logic App.

يمكنك استخدام إخراج عينة من خطوة Run query and list results .

  1. حدد Run Trigger في شريط Logic Apps. ثم حدد تشغيل وتنزيل وحفظ سجل إخراج. بالنسبة إلى نموذج الاستعلام في جذع السابق، يمكنك استخدام إخراج العينة التالي:

    {
        "TimeGenerated": "2020-09-29T23:11:02.578Z",
        "BlobTime": "2020-09-29T23:00:00Z",
        "OperationName": "Returns Storage Account SAS Token",
        "OperationNameValue": "MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE",
        "Level": "Informational",
        "ActivityStatus": "Started",
        "ResourceGroup": "monitoring",
        "SubscriptionId": "00000000-0000-0000-0000-000000000000",
        "Category": "Administrative",
        "EventSubmissionTimestamp": "2020-09-29T23:11:02Z",
        "ClientIpAddress": "192.168.1.100",
        "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/monitoring/providers/microsoft.storage/storageaccounts/my-storage-account"
    }
    
  2. حدد + New step ثم حدد + Add an action. ضمن Choose an operation، أدخل json ثم حدد Parse JSON.

    Screenshot that shows selecting a Parse JSON operator.

  3. حدد مربع المحتوى لعرض قائمة بالقيم من الأنشطة السابقة. قم بتحديد النص الأساسي من إجراء تشغيل الاستعلام ونتائج القائمة. هذا الإخراج من استعلام السجل.

    Screenshot that shows selecting a Body.

  4. انسخ نموذج السجل المحفوظ مسبقا. حدد Use sample payload لإنشاء مخطط ولصق.

    Screenshot that shows parsing a JSON payload.

إضافة إجراء إنشاء

الإجراء إنشاء يأخذ إخراج JSON توزيع وإنشاء الكائن الذي تحتاج إلى تخزين في النقطة.

  1. حدد + New step، ثم حدد + Add an action. ضمن اختيار عملية، أدخل إنشاء. ثم حدد الإجراء إنشاء .

    Screenshot that shows selecting a Compose action.

  2. حدد المربع Inputs لعرض قائمة بالقيم من الأنشطة السابقة. حدد «النص الأساسي» من الإجراء توزيعJSON. هذا الإخراج الذي تم تحليله من استعلام السجل.

    Screenshot that shows selecting a body for a Compose action.

إضافة إجراء إنشاء كائن ثنائي كبير الحجم

يكتب إجراء Create blob JSON الذي تم إنشاؤه إلى التخزين.

  1. حدد + New step، ثم حدد + Add an action. ضمن Choose an operation، أدخل blob. ثم حدد إجراء Create blob .

    Screenshot that shows selecting the Create Blob action.

  2. أدخل اسما للاتصال بحساب التخزين الخاص بك في اسم الاتصال ion. ثم حدد أيقونة المجلد في مربع مسار المجلد لتحديد الحاوية في حساب التخزين الخاص بك. حدد Blob name لمشاهدة قائمة بالقيم من الأنشطة السابقة. حدد تعبير وأدخل تعبيرا يتطابق مع الفاصل الزمني. بالنسبة لهذا الاستعلام، الذي يتم تشغيله كل ساعة، يعين التعبير التالي اسم الكائن الثنائي كبير الحجم لكل ساعة سابقة:

    subtractFromTime(formatDateTime(utcNow(),'yyyy-MM-ddTHH:00:00'), 1,'Hour')
    

    Screenshot that shows a blob expression.

  3. حدد مربع محتوى Blob لعرض قائمة بالقيم من الأنشطة السابقة. ثم حدد Outputs في قسم Compose .

    Screenshot that shows creating a blob expression.

اختبر سير العمل

لاختبار سير العمل، حدد Run. إذا كان سير العمل يحتوي على أخطاء، تتم الإشارة إليها على الخطوة مع المشكلة. يمكنك عرض عمليات التنفيذ والانتقال إلى كل خطوة لعرض الإدخال والإخراج للتحقق من حالات الفشل. راجع استكشاف أخطاء سير العمل وتشخيصها في Azure Logic Apps، إذا لزم الأمر.

Screenshot that shows Runs history.

عرض السجلات في التخزين

انتقل إلى قائمةحسابات التخزينفي مدخل Microsoft Azure وحدد حساب التخزين الخاص بك. حدد لوحة Blobs. ثم حدد الحاوية التي حددتها في إجراء Create blob . حدد أحد الكائنات الثنائية كبيرة الحجم ثم حدد Edit blob.

Screenshot that shows blob data.

قالب Logic App

لا يتم تضمين خطوة Parse JSON الاختيارية في القالب

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose": {
                "inputs": "@body('Run_query_and_list_results')",
                "runAfter": {
                    "Run_query_and_list_results": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "Create_blob_(V2)": {
                "inputs": {
                    "body": "@outputs('Compose')",
                    "headers": {
                        "ReadFileMetadataFromServer": true
                    },
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['azureblob']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/v2/datasets/@{encodeURIComponent(encodeURIComponent('AccountNameFromSettings'))}/files",
                    "queries": {
                        "folderPath": "/logicappexport",
                        "name": "@{utcNow()}",
                        "queryParametersSingleEncoded": true
                    }
                },
                "runAfter": {
                    "Compose": [
                        "Succeeded"
                    ]
                },
                "runtimeConfiguration": {
                    "contentTransfer": {
                        "transferMode": "Chunked"
                    }
                },
                "type": "ApiConnection"
            },
            "Run_query_and_list_results": {
                "inputs": {
                    "body": "let dt = now();\nlet year = datetime_part('year', dt);\nlet month = datetime_part('month', dt);\nlet day = datetime_part('day', dt);\n let hour = datetime_part('hour', dt);\nlet startTime = make_datetime(year,month,day,hour,0)-1h;\nlet endTime = startTime + 1h - 1tick;\nAzureActivity\n| where ingestion_time() between(startTime .. endTime)\n| project \n    TimeGenerated,\n    BlobTime = startTime, \n    OperationName ,\n    OperationNameValue ,\n    Level ,\n    ActivityStatus ,\n    ResourceGroup ,\n    SubscriptionId ,\n    Category ,\n    EventSubmissionTimestamp ,\n    ClientIpAddress = parse_json(HTTPRequest).clientIpAddress ,\n    ResourceId = _ResourceId ",
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/queryData",
                    "queries": {
                        "resourcegroups": "resource-group-name",
                        "resourcename": "workspace-name",
                        "resourcetype": "Log Analytics Workspace",
                        "subscriptions": "workspace-subscription-id",
                        "timerange": "Set in query"
                    }
                },
                "runAfter": {},
                "type": "ApiConnection"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {
            "$connections": {
                "defaultValue": {},
                "type": "Object"
            }
        },
        "triggers": {
            "Recurrence": {
                "evaluatedRecurrence": {
                    "frequency": "Day",
                    "interval": 1
                },
                "recurrence": {
                    "frequency": "Day",
                    "interval": 1
                },
                "type": "Recurrence"
            }
        }
    },
    "parameters": {
        "$connections": {
            "value": {
                "azureblob": {
                    "connectionId": "/subscriptions/logic-app-subscription-id/resourceGroups/logic-app-resource-group-name/providers/Microsoft.Web/connections/blob-connection-name",
                    "connectionName": "blob-connection-name",
                    "id": "/subscriptions/logic-app-subscription-id/providers/Microsoft.Web/locations/canadacentral/managedApis/azureblob"
                },
                "azuremonitorlogs": {
                    "connectionId": "/subscriptions/blob-connection-name/resourceGroups/logic-app-resource-group-name/providers/Microsoft.Web/connections/azure-monitor-logs-connection-name",
                    "connectionName": "azure-monitor-logs-connection-name",
                    "id": "/subscriptions/blob-connection-name/providers/Microsoft.Web/locations/canadacentral/managedApis/azuremonitorlogs"
                }
            }
        }
    }
}

الخطوات التالية