-1

我致力于使用 .net 核心编程语言开发基于容器的应用程序,并将这些应用程序部署在 azure kubernetes 服务中。还按照此文档实现了使用 azure 文件创建持久卷的功能。

到目前为止,一切正常,我可以通过在命令提示符中运行以下命令来查看安装在各个 pod 中的文件共享。

kubectl exec -it apiapplication-121213-121212 -- bash

df -h

但是我想在挂载的文件共享中创建具有 pod 名称和当前日期时间的新文件,例如(apiapplication-121213-121212_16-08-2018)。之后,我想将容器应用程序的日志存储在挂载文件共享中新创建的文件中。

4

3 回答 3

1

您可以手动编写一个脚本来获取您需要的信息:Pod 名称以及当前日期和时间。

1 - 首先获取这些参数并将它们存储在变量中

2-创建文件夹

3- 将日志存储并映射到这些文件夹。

1 - 您可以使用以下命令获取 pod 名称:

kubectl get pods

将名称存储在变量中。

2 - 使用类似于以下的代码:

public void CreateDirectory(string prefix)
{
    string dirName = prefix + " on " + DateTime.Now.ToString("ddd MM.dd.yyyy 'At' HH:mm tt");

    //Improved version of the above:
    string dirName = string.Format("{0} on {1:ddd MM.dd.yyy 'At' HH:mm tt}", prefix, DateTime.Now);

    Directory.CreateDirectory(dirName);
}

代码来源

您所要做的就是将变量名从 1 插入到 2 中的代码中。

3-我不确定您要路由文件夹的日志,但这应该是直截了当的。

于 2018-08-16T16:59:08.177 回答
1

最后,我通过在当前项目中编写以下代码行解决了我的问题。

 public class StoreLogsintoFileShare
{
    public static string pathString = string.Empty;
    public static void CreateSubFolderAndFile()
    {
        // Specify a name for your top-level folder.
        string currentFolderPath = "/mnt/azure";

        string subFolderName = "WebApplication";
        string date = DateTime.Now.ToString("ddd MM.dd.yyyy");
        string time = DateTime.Now.ToString("HH.mm tt");
        string format = "{0} on {1} At {2}.txt";
        string fileName = string.Format(format, "Logs", date, time);

        // To create a string that specifies the path to a subFolderName under your 
        // top-level folder, add a name for the subFolderName to folderName.
        pathString = System.IO.Path.Combine(currentFolderPath, subFolderName);

        //Create the subfolder. 
        System.IO.Directory.CreateDirectory(pathString);

        // Use Combine again to add the file name to the path.
        pathString = System.IO.Path.Combine(pathString, fileName);

        // Verify the path that you have constructed.
        Debug.WriteLine("Path to my file: {0}\n", pathString);

        // Check that the file doesn't already exist. If it doesn't exist, create
        // the file and write logs in to it.
        // DANGER: System.IO.File.Create will overwrite the file if it already exists.
        if (!System.IO.File.Exists(pathString))
        {
            using (System.IO.FileStream fs = System.IO.File.Create(pathString))
            {

            }
        }
        else
        {
            Debug.WriteLine("File \"{0}\" already exists.", fileName);
            return;
        }
    }
}

我在Startup.cs中调用上述方法,这就是为什么每当我启动应用程序时,会立即在名为“WebApplication”的子文件夹下使用“<strong>Logs on Thu 08.30.2018 At 18.43 PM.txt”创建一个新文件已经在 Kubernetes 的一个 pod 上创建/mnt/azure

一旦在/mnt/azure位置的 kuberneres 的 pod 上创建了文件,那么我必须在任何需要的地方编写一些虚拟日志,例如:

await System.IO.File.AppendAllLinesAsync(StoreLogsintoFileShare.pathString, new[] {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),ex.ToString()});

注意:但在上面的代码中,我没有动态获取 pod 名称。我只是使用静态名称作为“WebApplication”来创建子文件夹。

于 2018-08-31T04:56:03.410 回答
-1

我无法理解您要实现的目标,但您始终可以/var/log/containers/在单个主机上找到容器标准输出内容。要访问您的 Azure 存储帐户,您可以使用az cli 实用程序。如果你想在给定时间执行命令,你总是可以在大多数 Linux 发行版中使用 cron。

于 2018-08-20T16:33:43.287 回答